Ninject-当RequestScope没有意义时,DbContext应该绑定在什么范围内



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

然而,我现在担任的是控制台应用程序/Windows服务/AAzure工作角色(其实并不重要,只是没有Web请求范围),它定期创建许多异步运行的Tasks。我希望每个任务都有自己的DbContext,由于任务在自己的线程上运行,我尝试使用InThreadScope绑定DbContext

不幸的是,我意识到DbContext在任务完成时不会被处理。实际发生的情况是,线程返回到线程池,当它被分配一个新任务时,它已经有了一个DbContext,因此DbContext将永远保持活动状态。

有没有办法在这里使用InThreadScope,或者我应该使用其他范围?当线程不时从ThreadPool返回时,如何使用ThreadScope?

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

public sealed class CurrentScope : INotifyWhenDisposed
{
    [ThreadStatic]
    private static CurrentScope currentScope;
    private CurrentScope()
    {
    }
    public static CurrentScope Instance => currentScope ?? (currentScope = new CurrentScope());
    public bool IsDisposed { get; private set; }
    public event EventHandler Disposed;
    public void Dispose()
    {
        this.IsDisposed = true;
        currentScope = null;
        if (this.Disposed != null)
        {
            this.Disposed(this, EventArgs.Empty);
        }
    }
}

绑定:

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
}

相关内容

  • 没有找到相关文章

最新更新