所以,我有一个从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有何不同?
答案 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()
,它会在注入对象时立即处理对象。