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

时间:2010-11-15 16:02:24

标签: c# ninject-2

我有一个创建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();
}

我该如何做到这一点?

1 个答案:

答案 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类型使用并改为使用依赖注入。我会得到一个更好的设计。