На моем уровне обслуживания я ввел в конструктор UnitOfWork
и 2 репозитория. В модуле работы и хранилище есть экземпляр DbContext
. Я хочу поделиться между ними. Как я могу сделать это с помощью Ninject? Какую область следует рассматривать?Ищет область видимости Ninject, которая ведет себя как InRequestScope
Я не являюсь не в веб-приложении, поэтому я не могу использовать InRequestScope
.
Я пытаюсь сделать что-то подобное ... и я использую DI, но мне нужно, чтобы мой UoW был Dispose
d и создан вот так.
using (IUnitOfWork uow = new UnitOfWorkFactory.Create())
{
_testARepository.Insert(a);
_testBRepository.Insert(b);
uow.SaveChanges();
}
EDIT: Я просто хочу быть уверен, что я понимаю ... после того, как смотреть на https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope я, хотя о моей текущей архитектуры консоли приложения, которые на самом деле использовать Ninject.
Позволяет сказать:
Класс A представляет собой класс обслуживания слоя
Класс B является единицей работы, которая принимает во параметр интерфейс (IContextFactory)
Класс C представляет собой хранилище, которое принимает во параметр interface (IContextFactory)
Идея здесь заключается в том, чтобы иметь возможность выполнять операции контекста в 2 или более хранилищах и использовать единицу работы для применения изменений.
Класс D - это фабрика контекста (Entity Framework), которая предоставляет экземпляр (сохраняемый в контейнере) контекста, который совместно используется классом B и C (.. и будет использоваться и для других репозиториев).
Контекстная фабрика хранит экземпляр в своем контейнере, поэтому я не хочу повторно использовать этот экземпляр для всего имени, так как контекст должен быть удален в конце сервисной операции. Это основная цель InNamedScope на самом деле ?
Решение будет, но я не уверен, что я делаю это правильно, экземпляр служб будет трансформированным, что означает, что они на самом деле никогда не были утилизированы? :
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");
связаны: http://stackoverflow.com/questions/14554151/dependency-injection-and-life-time-of-idisposable-objects –
связанные с: http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why/10588594#10588594 –