我有一个根据this pattern实现IDisposable的类,因为它包含对HttpClient的引用。它看起来像这样:
public class CustomServiceClient : IDisposable
{
HttpClient client;
// ...
public ServiceCreatedEntity GetEntity()
{
// ...
}
~CustomServiceClient()
{
this.Dispose(false);
}
private bool disposed = false;
void IDisposable.Dispose()
{
if(!disposed)
{
this.Dispose(true);
GC.SuppressFinalize(this);
disposed = true;
}
}
public void Dispose(bool disposing)
{
if(disposing)
{
// dispose managed resources
client.Dispose();
}
// dispose unmanaged resources - this class has none
}
}
public class ServiceCreatedEntity
{
CustomServiceClient client;
public ServiceCreatedEntity(CustomServiceClient client)
{
this.client = client;
}
// some functions that use client
}
我想知道ServiceCreatedEntity
是否应该实现IDisposable并处理CustomServiceClient。我希望CustomServiceClient
的生命周期通常比ServiceCreatedEntity
更长,我担心客户会处置ServiceCreatedEntity
,并对其CustomServiceClient
的原因感到困惑已经被处理掉了。任何提示将不胜感激!
答案 0 :(得分:1)
更多的是什么创造了什么......创造者应该(通常)处理面向请求的世界中的拆解。
答案 1 :(得分:0)
ServiceCreatedEntity不应该处置客户端,但是如果它对客户端有依赖性,那么在客户端上包含IsDisposed属性或Disposing事件并使ServiceCreatedEntity可以在使用之前验证客户端没有被处置是没有坏处的,或者只是让CustomServiceClient在处理后使用时抛出错误。
答案 2 :(得分:0)
我很困惑为什么CustomServiceClient
有一个返回ServiceCreatedEntity
的方法,而ServiceCreatedEntity
在其构造函数中将CustomServiceClient
作为参数。
通常,如果传入对象,则不应将其置于该对象中。如果对象创建了IDisposable
,它本身应该实现IDisposable
并处理它。对于任何其他情况(例如IoC容器或某些花哨的东西),请考虑对象的生命周期以及何时处置它。
有关IDisposable
的更多信息,请查看this question。