Подтвердить что ты не робот

Ninject - В какой области DbContext должен быть привязан, когда RequestScope не имеет смысла?

В среде MVC/WebAPI я бы использовал InRequestScope для привязки DbContext.

Тем не менее, теперь я нахожусь в приложении Консоль/роль службы Windows/Azure (не имеет значения, просто нет области веб-запроса), которая периодически создает несколько Tasks которые выполняются асинхронно. Я хотел бы, чтобы каждая задача имела свой собственный DbContext, и поскольку задачи выполнялись в их собственном потоке, я попытался DbContext с помощью InThreadScope.

К сожалению, я понимаю, что DbContext не удаляется, когда задача завершена. Что на самом деле происходит, поток возвращается в пул потоков, и когда ему назначается новая задача, у него уже есть DbContext, поэтому DbContexts остаются в живых навсегда.

Есть ли способ использования InThreadScope здесь или я должен использовать другую область? Как ThreadScope можно использовать, когда потоки возвращаются из ThreadPool каждый раз?

4b9b3361

Ответ 1

Если вы решите продолжить работу с настраиваемой областью, решение будет:

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
}