C# Dispose()和Ninject的指南

C# Dispose()和Ninject的指南,c#,.net,garbage-collection,ninject,idisposable,C#,.net,Garbage Collection,Ninject,Idisposable,因此,我有一个从WCF服务公开的方法: public GetAllCommentsResponse GetAllComments(GetAllCommentsRequest request) { var response = new GetAllCommentsResponse(); using(_unitOfWork) try { Guard.ArgNotNull(request, "request");

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

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


Ninject处理除
InTransientScope
之外具有其他作用域的所有一次性对象。这就是为什么每个一次性对象都应该使用一个不是
InTransientScope()的作用域绑定
d
。例如,您可以使用
InParentScope()
一旦注入的对象被垃圾收集,它将立即从中处理该对象。

在类似帖子中找到答案:
SuppressFinalize
告诉GC系统“当您确定该对象是垃圾时,不要担心调用
Finalize
,因为我们已经在某人的帮助下执行了清理显式调用
Dispose
。如果不执行此操作,对象将保留在终结器队列中,并且Dispose将从终结器线程再次调用。这意味着在InRequestScope的
IDisposable
中,对象将在请求结束时被处置?是的,假设您做的一切都是正确的,包括使用OncePerWebRequest模块,据我所知,ninject也从不在InSingletonScope中进行处理。InSingletonScope在处理内核时进行处理。这应该可以工作:使用(IKernel kernel=new StandardKernel()){……}值得注意的是,如果未提供任何范围,“InTransientScope”是默认范围: