Auf meiner Service-Ebene habe ich eine UnitOfWork
und 2 Repositories in den Konstruktor injiziert. Die Unit of Work und das Repository haben eine Instanz von DbContext
, die ich zwischen den beiden teilen möchte. Wie kann ich das mit Ninject machen? Welcher Umfang sollte berücksichtigt werden?Suche nach einem Ninject-Bereich, der sich wie InRequestScope verhält
Ich bin nicht in einer Webanwendung so kann ich InRequestScope
nicht verwenden.
Ich versuche, etwas ähnliches zu tun ... und ich benutze DI, aber ich brauche meine UoW Dispose
d und erstellt so.
using (IUnitOfWork uow = new UnitOfWorkFactory.Create())
{
_testARepository.Insert(a);
_testBRepository.Insert(b);
uow.SaveChanges();
}
EDIT: Ich möchte nur sicher sein, ich verstehe ... nach Blick auf https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope i obwohl über meine aktuellen Konsolenanwendungsarchitektur, die Ninject tatsächlich nutzen.
Können sagen:
Klasse A ist eine Service-Schicht Klasse
Klasse B eine Arbeitseinheit ist, die Parameter nehmen in eine Schnittstelle (IContextFactory)
Klasse C ist ein Behälter, der in dauern Parameter eine Schnittstelle (IContextFactory)
Die Idee hier ist in der Lage sein, Kontextoperationen auf 2 oder mehr Repository zu tun und die Arbeitseinheit verwenden, um die Änderungen anzuwenden.
Klasse D ist eine Kontextfactory (Entity Framework), die eine Instanz (in einem Container enthalten) des Kontextes bereitstellt, der von Klasse B und C gemeinsam genutzt wird (.. und auch für andere Repositories).
Die Kontextfactory behält die Instanz in ihrem Container, sodass ich diese Instanz nicht alle Namen verwenden möchte, da der Kontext am Ende der Serviceoperation angeordnet werden muss. Dies ist der Hauptzweck des InNamedScopes tatsächlich ?
Die Lösung wäre, aber ich bin mir nicht sicher, ich mache es richtig, die Dienstleistungen Instanz wird transcient sein, was bedeutet, dass sie tatsächlich nie veräußert? :
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");
bezogen werden: http://stackoverflow.com/questions/14554151/dependency-injection-and-life-time-of-idisposable-objects –
bezogen werden: http://StackOverflow.com/Questions/10585478/one-dbcontext-per-web-request-why/10588594#10588594 –