Na mojej warstwie usługi wstrzyknąłem UnitOfWork
i 2 repozytoria w konstruktorze. Jednostka pracy i repozytorium mają instancję DbContext
Chcę się podzielić między nimi dwoma. Jak mogę to zrobić z programem Ninject? Który zakres należy rozważyć?Wyszukiwanie zakresu Ninject, który zachowuje się jak InRequestScope
Jestem nie jestem w aplikacji internetowej, więc nie mogę użyć InRequestScope
.
Próbuję zrobić coś podobnego ... i używam DI, ale potrzebuję, żeby moja wersja była Dispose
d i została stworzona w ten sposób.
using (IUnitOfWork uow = new UnitOfWorkFactory.Create())
{
_testARepository.Insert(a);
_testBRepository.Insert(b);
uow.SaveChanges();
}
EDIT: Chcę po prostu mieć pewność, rozumiem ... po spojrzeniu na https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope I chociaż o mojej obecnej architektury aplikacji konsoli, która faktycznie korzysta Ninject.
Umożliwia znaczy:
klasy A jest klasa Warstwa usług
Klasa B jest jednostką pracy, które biorą pod parametru interfejs (IContextFactory)
klasy C jest magazyn, który bierze pod Parametr interface (IContextFactory)
Chodzi o to, aby móc wykonywać operacje kontekstowe na 2 lub więcej repozytoriach i używać jednostki pracy do zastosowania zmian.
Klasa D jest fabryką kontekstu (Entity Framework), która dostarcza instancję (zachowaj w kontenerze) kontekstu, który jest współdzielony pomiędzy Klasą B i C (.. i będzie również dla innych repozytoriów).
Fabryka kontekstów zachowuje instancję w swoim kontenerze, więc nie chcę ponownie używać tej instancji pod wszystkimi nazwami, ponieważ kontekst musi zostać usunięty na końcu operacji usługi. Jest to główny cel InNamedScope tak właściwie ?
Rozwiązanie byłoby, ale nie jestem pewien, czy robię to dobrze, instancja usług będzie transcient, co oznacza, że faktycznie nigdy się nie disposed? :
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");
związane: http://stackoverflow.com/questions/14554151/dependency-injection-and-life-time-of-idisposable-objects –
związanych z: http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why/10588594#10588594 –