因此,我有一个从 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 文档指出,创建 Disposable 对象的人负责调用 Dispose。在本例中,该对象是由 Ninject 创建的。这意味着你应该not显式调用 Dispose。
Ninject 处理具有除InTransientScope
一旦创建的对象所绑定的作用域对象被 GC 收集 https://web.archive.org/web/20130111064153/http://kohari.org/2009/03/06/cache-and-collect-lifecycle-management-in-ninject-20/。这就是为什么每个一次性对象都应该是Bind
d 的范围不是InTransientScope()
。例如。您可以使用InParentScope()
from 命名范围扩展 https://github.com/ninject/ninject.extensions.namedscope/wiki一旦注入的对象被垃圾回收,它将立即处理该对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)