同时使用InRequestScope和InTransientScope将Ninject解析为相同类型

我有一个Ninject设置,创建一个JobContext解析器InRequestScope()这很好,但是,我在网站上有一个非常具体的调用,要求我循环几个数据库(数据库中的所有数据按年)。 我无法弄清楚发生了什么,因为我忘记了JobContext是InRequestScope但最后一段代码并没有按照我的想法行事。

这是设置

 //Ninject module Bind().To().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(); jobContext.SetYear(currentYear); } 

由于JobContext在请求范围内,因此每年都会重复使用相同的对象。 这是我需要InTransientScope而不是InRequestScope的唯一实例。

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

我怎么能做到这一点?

出现的一个问题是,如果您确实需要JobContext请求范围,有时在其他情况下需要瞬态范围。 似乎有一种设计气味! 在执行以下操作之前,请尝试解决此问题。

如果你真的想按照你所描述的方式去做,你必须指定两个不同的命名绑定,一个在瞬态,一个在请求范围内,它们按名称获取。

 this.Bind().To().InRequestScope().Named("RequestScoped"); this.Bind().To().InTransientScope().Named("TransientScoped"); kernel.Get("RequestScoped"); 

另一件事:我试图摆脱Ninject内核的ServiceLocator类型使用并改为使用dependency injection。 我会得到一个更好的设计。