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

Рекомендации по Dispose() и Ninject

Итак, у меня есть метод, открытый из службы WCF как таковой:

public GetAllCommentsResponse GetAllComments(GetAllCommentsRequest request)
{
    var response = new GetAllCommentsResponse();

    using(_unitOfWork)
        try
        {
            Guard.ArgNotNull(request, "request");

            var results = _unitOfWork.CommentRepository.Get(d => d.Id > 0).ToArray();

            //... Do rest of stuff here
        }
        catch (Exception ex)
        {
            response.Success = false;
            response.FailureInformation = ex.Message;
            Logger.LogError("GetAllComments Method Failed", ex);
        }

    return response;
}

У меня есть глобальный объект DataUnitOfWork (который реализует IDisposable), который получает экземпляр Ninject через аргумент конструктора при вызове службы. При отладке, если я использую

using(_unitOfWork)

Объект _unitOfWork сразу же появляется после выхода из области действия, а затем снова вызывается Ninject (хотя он был помечен как удаленный, поэтому ничего не происходит). Без оператора using Ninject обрабатывает удаление.

Короче говоря, существует ли общее правило для этого? Я боялся всего IDisposable вещи после того, как все, что я читаю, кажется, указывает, что никогда не использовать его или использовать в определенных эклектичных ситуациях, но это меня всегда путало.

Приветствуется любой ввод.

О, также, пока я нахожусь здесь, все равно, почему именно есть вызов GC.SuppressFinalize() при утилизации? Как Dispose и Finalize отличаются?

4b9b3361

Ответ 1

В документации CLR указано, что тот, кто создает объект Disposable, отвечает за вызов Dispose. В этом случае объект создается Ninject. Это означает, что вы не должны явно вызывать Dispose.

Ninject предоставляет каждый объект Disposable, который имеет другую область, отличную от InTransientScope как только объект области, к которому привязан созданный объект, собирается GC. Поэтому каждый объект Disposable должен быть Bind d с областью, которая не является InTransientScope(). Например. вы можете использовать InParentScope() из расширение NamedScope, которое будет удалять объект, как только объект, в который он впрыснут, является собранным мусором.