【发布时间】:2017-01-20 12:34:28
【问题描述】:
我有一个 ASP.NET MVC 应用程序,它使用 Quartz 运行几个计划的作业。
该项目使用具有存储库模式的实体框架。在我的 MVC 项目中,AppContext 和 GenericRepository 的绑定是 InRequestScope:
Bind<AppContext>().ToSelf().InRequestScope();
Bind<IGenericRepository>().To<GenericRepository>().InRequestScope();
GenericRepository 将AppContext 作为其构造函数参数,这里的作用域对于 MVC 项目非常有意义。然而,一些 Quartz 作业也使用上下文和存储库,显然,上述范围不适用于 Quartz 作业。例如:
public class SampleJob : IJob
{
public SampleJob(IGenericRepository repository)
{
// some code...
}
}
这里我需要用不同的范围注入IGenericRepository,也许是InThreadScope()。我可以通过IGenericRepository 的条件绑定来做到这一点,如下所示:
Bind<IGenericRepository>()
.To<GenericRepository>()
.InThreadScope()
.WhenInjectedInto<SampleJob>();
太棒了!这应该工作....
不,因为注入GenericRepository 的AppContext 仍将在RequestScope 中,所以我也需要AppContext 的条件绑定。但是怎么办??我做不到WhenInjectedInto,因为AppContext 总是会被注入GenericRepository。
有什么想法吗?或者,如果有更好的方法来管理 MVC 应用程序中的 Quartz 作业范围,请分享:)
【问题讨论】:
-
向 Quartz 端提供一个
IGenericRepositoryFactory并使用using语句将存储库的生命周期作为局部变量进行管理。 -
对不起,您能详细说明一下这种方法吗?谢谢!
标签: c# asp.net-mvc dependency-injection ninject quartz.net