Come rimuovere la funzionalità dell’unità di lavoro dai repository usando IOC

Ho un’applicazione che utilizza ASP.NET MVC, Unity e Linq to SQL.

Il contenitore di unità registra il tipo AcmeDataContext che eredita da System.Data.Linq.DataContext , con un LifetimeManager utilizza HttpContext .

C’è una fabbrica di controllori che riceve le istanze del controllore usando il container di unità. Ho impostato tutte le mie dipendenze sui costruttori, in questo modo:

 // Initialize a new instance of the EmployeeController class public EmployeeController(IEmployeeService service) // Initializes a new instance of the EmployeeService class public EmployeeService(IEmployeeRepository repository) : IEmployeeService // Initialize a new instance of the EmployeeRepository class public EmployeeRepository(AcmeDataContext dataContext) : IEmployeeRepository 

Ogni volta che è necessario un costruttore, il contenitore di unità risolve una connessione, che viene utilizzata per risolvere un contesto di dati, quindi un repository, quindi un servizio e infine il controller.

Il problema è che IEmployeeRepository espone il metodo SubmitChanges , poiché le classi di servizio NON hanno un riferimento DataContext .

Mi è stato detto che l’unità di lavoro dovrebbe essere gestita dall’esterno dei repository, quindi sembrerebbe che dovrei rimuovere SubmitChanges dai miei repository. Perché?

Se questo è vero, significa che devo dichiarare un’interfaccia IUnitOfWork e rendere ogni class di servizio dipendente da questo? In quale altro modo posso consentire alle mie classi di servizio di gestire l’unità di lavoro?