所以,我有一个从 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有什么区别?
SuppressFinalize
告诉 GC 系统:“当您确定对象是垃圾并且我们已经通过某人显式调用Dispose
进行了清理时,请不要担心调用Finalize
。如果您不这样做,对象将保留在终结器队列中,并且Dispose
将再次从终结器线程调用。” - Ruben Bartelink