C# Dispose()和Ninject的指南
因此,我有一个从WCF服务公开的方法: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");
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”是默认范围: