在执行Quartz.Net作业实现期间,通过Ninject依赖项解析器实例化的DbContext实现使用的最佳范围是什么?如果我使用了线程范围,如果使用Quartz线程池中的相同线程多次执行该作业,是否会提供相同的DbContext实例?
我想要一个范围,这意味着每次触发作业时我都会获得一个(并且只有一个)DbContext的新实例。
答案 0 :(得分:6)
是的,我建议不要使用InThreadScope
。当使用线程池线程时,会有泄漏。
此外,没有任何内置于ninject中的内容,例如" QuartzScope",因此您必须创建自己的解决方案。让我们从作业的实例化开始。这由this stackoverflow answer覆盖,更广泛地由the source code of this nuget package覆盖。
现在一种可能的解决方案是扩展JobFactory以管理DbContext
的创建,并将其注入作业及其所有依赖项(作为继承的ConstructorArgument
参数)。但是,这有两个缺点:始终创建DBContext
(无论作业是否需要),您需要跟踪DBContext
个实例,以便.Dispose()
个IJobFactory.ReturnJob(IJob)
个实例可以Dictionary<IJob, DBContext
1}}方法(由.InCallScope
或类似的p.ex.)。
更简单的方法是使用DbContext
(包含在Ninject.Extensions.NamedScope中)进行DbContext
绑定。这将为每kernel.Get<FooJob>()
创建一个DbContext
个实例。
如果您需要为{{1}}设置不同的范围 - 具体取决于您使用它们的位置,请参阅。在Job中和ASP.NET MVC内部,您可能需要查看Ninject Conditional Self bind to change scope (For Task-scheduler) not working properly?