Конфигурирование Ninject для консольного приложения и использование существующего хранилища для моего приложения MVC - PullRequest
15 голосов
/ 08 июля 2011

У меня есть решение MVC 3, настроенное с помощью Ninject с использованием шаблона хранилища. Некоторые из моих привязок включают в себя:

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InRequestScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope();
kernel.Bind<IMyService>().To<MyService>().InRequestScope();
kernel.Bind<ILogging>().To<Logging>().InSingletonScope();

Я также добавил консольное приложение в свое решение и хочу использовать тот же репозиторий и сервисы. Моя конфигурация Ninject для консольного приложения выглядит следующим образом:

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope();
kernel.Bind<IMyRepository>().To<MyRepository>().InSingletonScope();
kernel.Bind<IMyService>().To<MyService>().InSingletonScope();
kernel.Bind<ILogging>().To<Logging>().InSingletonScope();

Мой код консоли выглядит так:

static void Main(string[] args)
{
    IKernel kernel = new StandardKernel(new IoCMapper());

    var service = kernel.Get<IMyService>();
    var logger = kernel.Get<ILogging>();

    ... do some processing here
}

Это прекрасно работает, но я хочу быть уверенным, что я правильно настраиваю Ninject для консольного приложения. Правильно ли использовать InSingletonScope () для всех моих привязок в консольном приложении? Должен ли я настроить его по-другому?

1 Ответ

11 голосов
/ 08 июля 2011

Хотите ли вы один и только один экземпляр каждого из ваших сервисов репозитория для всего приложения? Если это так, то используйте InSingletonScope.

Является ли ваше консольное приложение многопоточным? Если это так, и вы хотите новый экземпляр ваших служб для каждого потока, то вы будете использовать InThreadScope.

Если вы хотите, чтобы новые экземпляры служб каждый раз вызывались, установите для них значение InTransientScope.

У вас также есть возможность определить свою собственную область, используя InScope. Боб Крэйвенс дает хороший обзор каждого из них здесь http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

...