【问题标题】:How to manage Ninject scope binding for objects used by both ASP.NET MVC and Quartz?如何管理 ASP.NET MVC 和 Quartz 使用的对象的 Ninject 范围绑定?
【发布时间】:2017-01-20 12:34:28
【问题描述】:

我有一个 ASP.NET MVC 应用程序,它使用 Quartz 运行几个计划的作业。

该项目使用具有存储库模式的实体框架。在我的 MVC 项目中,AppContextGenericRepository 的绑定是 InRequestScope

Bind<AppContext>().ToSelf().InRequestScope();
Bind<IGenericRepository>().To<GenericRepository>().InRequestScope();

GenericRepositoryAppContext 作为其构造函数参数,这里的作用域对于 MVC 项目非常有意义。然而,一些 Quartz 作业也使用上下文和存储库,显然,上述范围不适用于 Quartz 作业。例如:

public class SampleJob : IJob 
{
    public SampleJob(IGenericRepository repository)
    {
        // some code...
    }
}

这里我需要用不同的范围注入IGenericRepository,也许是InThreadScope()。我可以通过IGenericRepository 的条件绑定来做到这一点,如下所示:

Bind<IGenericRepository>()
    .To<GenericRepository>()
    .InThreadScope()
    .WhenInjectedInto<SampleJob>();

太棒了!这应该工作....

不,因为注入GenericRepositoryAppContext 仍将在RequestScope 中,所以我也需要AppContext 的条件绑定。但是怎么办??我做不到WhenInjectedInto,因为AppContext 总是会被注入GenericRepository

有什么想法吗?或者,如果有更好的方法来管理 MVC 应用程序中的 Quartz 作业范围,请分享:)

【问题讨论】:

  • 向 Quartz 端提供一个 IGenericRepositoryFactory 并使用 using 语句将存储库的生命周期作为局部变量进行管理。
  • 对不起,您能详细说明一下这种方法吗?谢谢!

标签: c# asp.net-mvc dependency-injection ninject quartz.net


【解决方案1】:

Ninject 提供了一个通用的InScope() 方法,您可以使用它来返回您自己的定义范围的自定义对象。我过去曾使用它首先尝试解析请求范围,如果没有,则将当前线程作为范围返回。这样你就有了一种“混合”范围。

【讨论】:

  • 很抱歉,Dave 回复晚了。但是考虑一个场景,它能够解析请求范围(我相信这取决于HttpContext.Current),但是在作业执行期间,请求结束(HttpContext 被处理),即使作业可能仍在运行.那会发生什么?
  • HttpContext.Current 在内部使用 LogicalCallContext 将 HttpContext 存储在“逻辑”线程存储中(与严格的线程存储不同,它流经异步任务)从创建它的线程中保留 HttpContext .因此,如果 Quartz 正在创建作业,则不会有一个,即使在同一进程中有活动的 Web 请求也是如此。否则,同一进程中的多个请求将覆盖HttpContext.Current
  • 感谢 Dave,我一直以错误的方式理解 HttpContext。现在它更有意义了,你的回答将完美地解决我的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多