在Quartz.Net作业中使用的DBContext的Ninject范围

时间:2014-08-16 12:00:57

标签: ninject dbcontext quartz.net

在执行Quartz.Net作业实现期间,通过Ninject依赖项解析器实例化的DbContext实现使用的最佳范围是什么?如果我使用了线程范围,如果使用Quartz线程池中的相同线程多次执行该作业,是否会提供相同的DbContext实例?

我想要一个范围,这意味着每次触发作业时我都会获得一个(并且只有一个)DbContext的新实例。

1 个答案:

答案 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?