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).