指南对于Dispose()方法和Ninject指南对于Dispose()方法和Ninject(Gui

2019-05-11 21:58发布

所以,我有从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()的调用处置时? 如何处置和完成有什么不同?

Answer 1:

CLR的文档指出谁创建了一个一次性的对象负责调用Dispose。 在这种情况下,该目的通过Ninject创建。 这意味着你应该调用明确处置。

Ninject部署有另一个范围上比其他所有的一次性对象InTransientScope 只要到这追平了创建的对象是由GC收集的范围对象 。 这就是为什么每一个一次性的对象应该被Bind d与范围不是InTransientScope() 。 例如,你可以使用InParentScope()从该NamedScope扩展将尽快处置对象为对象时,它被注入到被垃圾收集。



文章来源: Guidelines For Dispose() and Ninject