Рекомендации по утилизации () и 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?

1 ответ

Решение

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

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

Другие вопросы по тегам