Dispose()和Ninject指南

时间:2012-04-19 18:49:41

标签: c# .net garbage-collection ninject idisposable

所以,我有一个从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 个答案:

答案 0 :(得分:48)

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

Ninject处理具有InTransientScope as soon as the scope object to which the created object is tied is collected by GC以外的其他范围的每个Disposable对象。这就是为什么每个Disposable对象都应该是Bind d,其范围不是InTransientScope()。例如。你可以使用the NamedScope extension中的InParentScope(),它会在注入对象时立即处理对象。