1

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

我怎样才能做到这一点?

4

1 回答 1

3

出现的一个问题是您是否真的需要 JobContext 有时在请求范围内,而在其他情况下在瞬态范围内。好像有设计的味道!在执行以下操作之前尝试解决此问题。

如果您真的想按照您描述的方式执行此操作,则必须指定两个不同的命名绑定,一个是瞬态的,一个是请求范围的,它们通过名称获取它们。

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

只是另一件事:我会成功尝试摆脱 Ninject 内核的 ServiceLocator 类型的使用,并改用依赖注入。我会得到一个更好的设计。

于 2010-11-15T18:06:32.590 回答