Наличие как InRequestScope, так и InTransientScope для Ninject, разрешающих один и тот же тип

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

Вот настройки

//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();
}

Как я могу сделать это?

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам