32

所以,我有一个从 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 有何不同?

4

1 回答 1

53

CLR 文档指出,创建 Disposable 对象的人负责调用 Dispose。在这种情况下,对象是由 Ninject 创建的。这意味着您不应该式调用 Dispose。

Ninject 处置具有另一个作用域的每个 Disposable 对象,而不是InTransientScope 在 GC 收集所创建对象所绑定的作用域对象时。这就是为什么每个 Disposable 对象都应该是Bindd ,其范围不是InTransientScope()。例如,您可以InParentScope()NamedScope 扩展中使用它,一旦注入的对象被垃圾收集,它将立即处理该对象。

于 2012-04-20T08:06:10.467 回答