翻译

IDisposable与所有权

在IoC之前(或许你现在正在用它)你有两种方式调用Dispose()方法

1.使用C#using声明

2.Ad-hoc

IDisposable和using是相匹配的,但是它们仅能运用在资源的生命周期在单个的方法中的情况。

你需要找到一种策略来确保当资源不再被需要时销毁掉。最常用的一种是基于无论对象是怎样被获取的,都应该释放掉。我暂且把它叫做“ad-hoc”因为,它并不是一直都有效。最终,你会碰到下面的一个问题 (或者更多):

共享:当多个独立的组件共享资源时很难判断什么时候所有的组件都不再需要这个资源。或者第三方需要知道资源所有的潜在消费者,或者组件之间协作,无论哪种方式,事情很快就会变得很糟。

级联修改:让我们假设有三个组件-A使用B,B使用C。如果没有资源参与进来,那么就不用考虑资源的所有权和资源的释放。但是,如果程序发生了变化,C现在需要包含一个可销毁的资源,那么当资源不再需要时,A和B大概需要适当的改变一下行为了(通过disposal)。

协议 vs 实现:在.NET中鼓励面向接口编程而不是面向实现编程。精心设计的API通常不会暴露实现的细节。例如,一个抽象工厂可以被用来创建不同大小的缓存:

public ICache CreateCache(int maximumByteSize);  // Abstract Factory

interface ICache // : IDisposable?
{
    void Add(object key, object value, TimeSpan ttl);
    bool TryLookup(object key, out object value);
}

在初期的实现中可能仅返回MemoryCache对象,它没有资源管理的需求。然而,我们在未来可能创建一个FileCache的实现,那是否意味着ICache接口应该是可销毁的呢?

任何协议的问题根源在于,我们可以想象到总有一天会需要一个可销毁的实现。

posted @ 2015-04-29 17:01  Ghost.KR  阅读(150)  评论(0编辑  收藏  举报