Szukam zakresu Ninject, który zachowuje się jak InRequestScope
Na mojej warstwie serwisowej wstrzyknąłemUnitOfWork
i 2 repozytoria w konstruktorze. Jednostka pracy i repozytorium mają instancję aDbContext
Chcę się podzielić między nimi dwoma. Jak mogę to zrobić za pomocą Ninject? Jaki zakres należy rozważyć?
jestemnie w aplikacji internetowej więc nie mogę użyćInRequestScope
.
Próbuję zrobić coś podobnego ... i używam DI, ale potrzebuję mojej UOWDispose
d i stworzyliśmy w ten sposób.
using (IUnitOfWork uow = new UnitOfWorkFactory.Create())
{
_testARepository.Insert(a);
_testBRepository.Insert(b);
uow.SaveChanges();
}
EDYCJA: Chcę tylko mieć pewność, że rozumiem… po obejrzeniuhttps://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope myślę o mojej obecnej architekturze aplikacji konsoli, która faktycznie używa Ninject.
Powiedzmy :
Klasa A to klasa warstwy usług
Klasa B to jednostka pracy, która przyjmuje parametr interfejsu (IContextFactory)
Klasa C jest repozytorium, które przyjmuje parametr interfejsu (IContextFactory)
Chodzi o to, aby móc wykonywać operacje kontekstowe na 2 lub więcej repozytoriach i używać jednostki pracy do wprowadzania zmian.
Klasa D jest fabryką kontekstu (Entity Framework), która udostępnia instancję (trzymaną w kontenerze) kontekstu, który jest współdzielony między klasą B i C (.. i byłby również dla innych repozytoriów).
Fabryka kontekstów utrzymuje instancję w swoim kontenerze, więc nie chcę ponownie używać tej instancji całej nazwy, ponieważ kontekst musi zostać usunięty na końcu operacji usługi. Jest to główny cel InNamedScope?
Rozwiązaniem byłoby, ale w ogóle nie jestem pewien, czy robię to dobrze, instancja usługowa będzie przekrojowa, co oznacza, że tak naprawdę nigdy się nie pozbyli? :
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");