Ninject - 当RequestScope无意义时,DbContext应在什么范围内绑定?

时间:2014-04-15 10:59:27

标签: multithreading entity-framework dependency-injection ninject threadpool

在MVC / WebAPI环境中,我会使用InRequestScope绑定DbContext

但是,我现在处于Console应用程序/ Windows服务/ Azure辅助角色(并不重要,只是没有Web请求范围),它会定期创建一些异步运行的Tasks。我希望每个任务都有自己的DbContext,并且由于任务在他们自己的线程上运行,我尝试使用DbContext绑定InThreadScope

不幸的是,我意识到任务完成时不会处理DbContext。实际发生的是,线程返回线程池,当它被分配一个新任务时,它已经有一个DbContext,所以DbContexts永远保持活着。

有没有InThreadScope可以在这里使用的方式,还是应该使用其他范围?当线程从ThreadPool中不时返回时,如何使用ThreadScope?

1 个答案:

答案 0 :(得分:1)

如果您决定继续使用自定义范围,解决方案是:

Bind<DbContext>().To<MyDbContext>().InScope(c => CurrentScope.Instance)

结合:

using (CurrentScope.Instance)
{
    // your request...
    // you'll get always the same DbContext inside of this using block
    // DbContext will be disposed after going out of scope of this using block
}

最后:

return K.mean((y_true+K.epsilon()) * K.square(y_pred - y_true), axis=-1)