我有一个创建JobContext解析器的Ninject设置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();
}
我该如何做到这一点?
答案 0 :(得分:3)
出现的一个问题是,如果您确实需要在请求范围内的JobContext,而在其他情况下需要瞬态范围。似乎有一种设计气味!在执行以下操作之前,请尝试解决此问题。
如果你真的想以你所描述的方式去做,你必须指定两个不同的命名绑定,一个在瞬态,一个在请求范围内,它们按名称获取。
this.Bind<IJobContext>().To<JobContext>().InRequestScope().Named("RequestScoped");
this.Bind<IJobContext>().To<JobContext>().InTransientScope().Named("TransientScoped");
kernel.Get<IJobContext>("RequestScoped");
另一件事:我试图摆脱Ninject内核的ServiceLocator类型使用并改为使用依赖注入。我会得到一个更好的设计。