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

Sim*_*een 5 ninject quartz.net dbcontext

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

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

Bat*_*nit 6

是的,我建议不要使用InThreadScope.使用线程池线程时,会发生泄漏.

此外,ninject中没有像"QuartzScope"那样内置,所以你必须创建自己的解决方案.让我们从作业的实例化开始.这所涵盖这个计算器的答案,更广泛的,通过这个NuGet包的源代码.

现在一种可能的解决方案是扩展JobFactory以管理其创建DbContext并将其注入作业及其所有依赖项(作为继承ConstructorArgument参数).但是,这有两个缺点:总是创建一个DBContext(无论作业是否需要它),并且你需要跟踪DBContext实例,以便你可以.Dispose()IJobFactory.ReturnJob(IJob)方法中使用它们(p.ex.由a Dictionary<IJob, DBContext或者喜欢).

更简单的方法是使用.InCallScope(包含在Ninject.Extensions.NamedScope中)进行DbContext绑定.这将创建一个DbContext实例kernel.Get<FooJob>().

如果你需要有不同的范围DbContext- 取决于你使用它们的位置,p.Ex.在一个Job和你的ASP.NET MVC内部,你可能想看一下Ninject Conditional Self bind来改变范围(For Task-scheduler)不能正常工作?