2010-11-15 2 views
1

У меня есть установка Ninject, которая создает преобразователь JobContext InRequestScope() Это работает отлично, однако у меня есть очень специфический вызов на Веб-сайте, который требует от меня прокрутки несколько баз данных (все данные в базах данных по годам). Я не мог понять, что происходит, потому что я забыл, что JobContext был InRequestScope, но последний блок кода был не, как я думал, что это должно произойти.Имея как InRequestScope, так и InTransientScope для Ninject, разрешающие один и тот же тип

Вот установка

//Ninject module 
Bind<Data.IJobContext>().To<Data.JobContext>().InRequestScope(); 


//Controller's Initialize 
protected override void Initialize(System.Web.Routing.RequestContext requestContext) { 
    base.Initialize(requestContext); 

    //set a connection string for the jobContext 
    this.jobContext = DependencyResolver.Current.GetService<IJobContext>(); 
    jobContext.SetYear(currentYear); 
} 

Поскольку JobContext находится в области действия запроса он держит повторно использовать один и тот же объект, на каждый год. Это единственный случай, когда мне нужно, чтобы он был InTransientScope, а не InRequestScope.

//Special function 
foreach (int year in ActiveYears) { 
    jobContext = DependencyResolver.Current.GetService<IJobContext>(); 
    jobContext.SetYear(year); 
    DoSomething(); 
} 

Как это сделать?

ответ

3

Возникает один вопрос: действительно ли вам нужен объект JobContext в области запроса иногда и в других случаях в переходном режиме. Кажется, что есть запах дизайна! Попытайтесь исправить это, прежде чем делать следующее.

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

this.Bind<IJobContext>().To<JobContext>().InRequestScope().Named("RequestScoped"); 
this.Bind<IJobContext>().To<JobContext>().InTransientScope().Named("TransientScoped"); 
kernel.Get<IJobContext>("RequestScoped"); 

Просто еще одно: я бы succest, чтобы попытаться избавиться от ServiceLocator любезного использования ядра Ninject и использовать инъекции зависимостей вместо этого. Я получу лучший дизайн.

+0

Ну, почти на каждой странице это необходимо только для конкретного года. За исключением одного звонка, где мне нужно перечислить все записи в каждой из баз данных. Я не знал о «Именованном». Хотя мне это не нравится, это действительно работает. Я попытался выяснить другой способ сделать это, но я в недоумении. :) – Buildstarted

+0

Я использую инъекцию зависимостей всюду, кроме этого одного места, btw :) – Buildstarted

+0

Если вы используете InRequestScope и происходит ошибка проверки Db, вы не сможете сохранить его в своей базе данных с контекстом области запроса. В этом случае вы хотите, чтобы временная область сохраняла это конкретное исключение в вашей базе данных. Этот пост дает большую информацию: http://stackoverflow.com/questions/26775080/how-to-handle-async-calls-with-ninject-inrequestscope – jsgoupil

 Смежные вопросы

  • Нет связанных вопросов^_^