На моем уровне сервиса я ввел конструктор UnitOfWork
и 2 в конструкторе. В модуле работы и хранилище есть экземпляр DbContext
, который я хочу разделить между ними. Как я могу сделать это с помощью Ninject? Какую область следует рассматривать?
Я не в веб-приложении, поэтому я не могу использовать 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 i, хотя о моей текущей архитектуре консольного приложения, которая фактически использует Ninject.
Давайте скажем:
Класс A - класс уровня обслуживания
Класс B - это единица работы, которая принимает в параметр интерфейс (IContextFactory)
Класс C - это репозиторий, который принимает в параметр интерфейс (IContextFactory)
Идея здесь состоит в том, чтобы иметь возможность выполнять контекстные операции в 2 или более репозиториях и использовать единицу работы для применения изменений.
Класс D представляет собой контекст factory (Entity Framework), который предоставляет экземпляр (сохраняйте в контейнере) контекст, который разделяется между классом B и C (.. и будет также для других репозиториев).
Контекст factory сохраняет экземпляр в своем контейнере, поэтому я не хочу повторно использовать этот экземпляр для всего имени, так как контекст должен быть удален в конце сервисной операции. Это основная цель 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");