In Entity Framework come faccio a racchiudere una chiamata al database con una chiamata a un altro servizio e assicurare che vengano sempre chiamati insieme?

0

Ho un modello di framework di entità chiamato Employee. Ogni volta che richiedo un elenco di tutte le righe Employee, desidero innanzitutto fare una richiesta soap per ottenere nuovi dipendenti da un altro sistema e aggiornare il database sql con loro.

C'è una sorta di legame che potrei applicare al modello o dovrei semplicemente aggiungere un altro modello che chiama entrambi e chiamalo invece.

Voglio farlo in modo che non possa chiamare l'elenco dei dipendenti dal database direttamente senza aggiornarlo in ogni punto delle pagine del rasoio dove lo chiamo.

    
posta Matt Ralston 27.08.2018 - 19:41
fonte

2 risposte

1

Modificatori di accesso e separazione dei livelli.

I modificatori di accesso ( public , private , internal , protected ) ti consentono di impedire a un chiamante esterno di chiamare la logica interna direttamente, e invece forza per utilizzare solo la logica a cui gli è stato concesso l'accesso.

Se si estrae la logica di accesso ai dati in un progetto / livello separato (noto come DAL), è possibile ottenere ciò che si desidera.

Come semplice esempio:

internal class MyContext : DbContext
{
    // ...
}

public class EmployeeRepository
{
    public List<Employee> GetEmployees()
    {
        using(var db = new MyContext())
        {
            UpdateEmployeeList(db);

            return db.Employees.ToList();
        }
    }

    private void UpdateEmployeeList(MyContext db)
    {
        var externalEmployeeList = GetExternalEmployeeList();

        foreach(var employee in externalEmployeeList)
        {
            db.Add(employee);
        }

        db.SaveChanges();
    }
}

Un chiamante esterno può ottenere solo i dati dei dipendenti effettuando le seguenti operazioni:

var employeeRepository = new EmployeeRepository();
var employees = employeeRepository.GetEmployees();

Pertanto, è impossibile per loro ignorare la chiamata SOAP aggiuntiva.

Tuttavia , ciò significa che i chiamanti esterni non possono avere accesso diretto a MyContext e devono sempre utilizzare i metodi che hai creato per loro.

Nelle codebase professionali, la segregazione dei livelli è un evento comune che in genere è già il caso. Mi aspetto che ogni codebase professionale possa separare il suo DAL (livello di dati in ingresso) in un progetto separato e non perdere la sua dipendenza interna (come EF's DbContext ).

Sebbene sia tecnicamente possibile fare cose come intercettare le query, questo non sarà facile da sviluppare o mantenere.

Ciò che stai effettivamente chiedendo è il seguente:

I want to force external callers to use my logic (= enforcing the additional SOAP call) instead of just using EF directly.

La conseguenza logica è che tu devi creare la tua logica . Questo è il DAL di cui stavo parlando, è un progetto che esiste specificamente per separare il chiamante esterno da EF, e invece forzare il chiamante esterno ad usare la logica del DAL (che userà EF se e quando lo vorrebbe - il chiamante esterno non lo fa non prendere la decisione).

    
risposta data 28.08.2018 - 10:28
fonte
2

Potresti provare ad intercettare la DB-Query. Ciò consente di eseguire codice personalizzato prima che venga eseguita la query del database. Controlla il seguente link: link

In teoria funzionerà, ma a mio parere è un modo piuttosto brutto per chiamare un servizio SOAP, che è completamente indipendente dal DB, in un intercettore "casuale".

Invece dovresti fornire una classe ai tuoi modelli di GUI (?) che non gli danno l'EF DataContext ma una classe che controlli. Questo strato dell'applicazione chiamato ad es. dataprovider decide quindi se chiamare il servizio SOAP e aggiornare il db prima di interrogarlo o meno.

Questa è solo un'opinione personale di me.

    
risposta data 27.08.2018 - 19:54
fonte

Leggi altre domande sui tag