2013-05-18 2 views
1

У меня есть приложение ASP.NET MVC с использованием Ninject3 (установка NuGet). Раствор содержит:Как (не) указать область в библиотеках классов с помощью Ninject3

  • проект MVC (состав корневых);
  • проект модели домена;
  • a Проект уровня данных;
  • проект планировщика (выполнение запланированных заданий в службе Windows и проведение альтернативы состав корень);
  • некоторые другие проекты.

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

Я не могу понять, как настроить область для модулей в библиотеках классов. Например, с учетом этих привязок:

Bind<IDomainService1>() 
    .To<Service1Impl>() 
    .InSingletonScope(); //This should always be a singleton 

Bind<IDomainService2>() 
    .To<Service2Impl>(); //No scope specified 

Я всегда хочу один экземпляр Service1Impl, в то время как возможности для Service2Impl должна зависеть от корня композиции, используемой. Проект MVC должен иметь InRequestScope() для Service2Impl (и для всех других привязок с неопределенной областью). Проект Scheduler, который не запускается в контексте http, должен использовать InThreadScope().

Правильно ли этот подход? Если да, то каков правильный способ настройки этого поведения?

ответ

1

In Ninject, not specifying the scope means InTransientScope().

Ваш выбор состоит в том, чтобы либо дублировать привязки, либо создать настраиваемое правило привязки InScope() для привязки.

Самое чистое решение (особенно учитывая, что MVC уже в игре) - это создание плагина, который размещается в механизме InRequestScope().

Существует метод CreateScope(), который в настоящее время имеет минимальную документацию в файле ninject.extensions.namedscope README, который используется like this. Он требует, чтобы вы выбрали «Включить предварительную загрузку» в NuGet. (И я должен написать статью о вики, но у меня слишком много других вещей на моей тарелке ...)