Sul mio livello di servizio ho iniettato uno UnitOfWork
e 2 repository nel costruttore. L'unità di lavoro e il deposito hanno un'istanza di DbContext
che voglio condividere tra loro due. Come posso farlo con Ninject? Quale ambito dovrebbe essere considerato?Ricerca di un ambito Ninject che si comporta come InRequestScope
Sono non in un'applicazione Web quindi non posso utilizzare InRequestScope
.
Provo a fare qualcosa di simile ... e sto usando DI tuttavia, ho bisogno che il mio UoW sia Dispose
d creato in questo modo.
using (IUnitOfWork uow = new UnitOfWorkFactory.Create())
{
_testARepository.Insert(a);
_testBRepository.Insert(b);
uow.SaveChanges();
}
EDIT: voglio solo essere sicuro di aver capito ... dopo un'occhiata a https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope i se circa il mio attuale architettura delle applicazioni di console che in realtà uso Ninject.
consente di dire:
Classe A è una classe livello di servizio
Classe B è un unità di lavoro che tengano parametro un'interfaccia (IContextFactory)
Classe C è un repository che tengano parametrizzare un'interfaccia (IContextFactory)
L'idea qui è di essere in grado di eseguire operazioni di contesto su 2 o più repository e utilizzando l'unità di lavoro per applicare le modifiche.
Classe D è una factory di contesto (Entity Framework) che fornisce un'istanza (keep in a container) del contesto che è condivisa tra Class B et C (.. e sarebbe anche per altri repository).
Il factory di contesto mantiene l'istanza nel suo contenitore quindi non voglio riutilizzare questa istanza tutto il nome poiché il contesto deve essere eliminato alla fine dell'operazione di servizio .. è lo scopo principale di InNamedScope in realtà ?
La soluzione sarebbe, ma non sono sicuro che lo stia facendo bene, l'istanza dei servizi sarà transitoria, il che significa che in realtà non sono mai disposti? :
Bind<IScsContextFactory>()
.To<ScsContextFactory>()
.InNamedScope("ServiceScope")
.WithConstructorArgument(
"connectionString",
ConfigurationUtility.GetConnectionString());
Bind<IUnitOfWork>().To<ScsUnitOfWork>();
Bind<IAccountRepository>().To<AccountRepository>();
Bind<IBlockedIpRepository>().To<BlockedIpRepository>();
Bind<IAccountService>().To<AccountService>().DefinesNamedScope("ServiceScope");
Bind<IBlockedIpService>().To<BlockedIpService>().DefinesNamedScope("ServiceScope");
correlati: http://stackoverflow.com/questions/14554151/dependency-injection-and-life-time-of-idisposable-objects –
correlati: http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why/10588594#10588594 –