DI用一次性物品

时间:2010-03-08 19:16:51

标签: c# design-patterns dispose

假设我的存储库类看起来像这样:

class myRepository : IDisposable{
    private DataContext _context;
    public myRepository(DataContext context){
        _context = context;
    }
    public void Dispose(){ 
        // to do: implement dispose of DataContext
    }
}

现在,我正在使用Unity来控制我的存储库的生命周期。数据背景&将生命周期配置为:
DataContext - 单身人士 myRepository - 每次都创建一个新实例

这是否意味着我不应该在存储库上实现IDisposable来清理DataContext?

有关此类项目的任何指导吗?

编辑: DataContext - 单例 - 将其读作单个每网络请求

3 个答案:

答案 0 :(得分:4)

作为一般规则,抽象依赖关系不应来自IDisposable ,因为它将是 Leaky Abstraction 。依赖关系可能会或可能不会保留依赖于具体实现的非托管资源。在任何情况下,容器都应该管理生命周期,因此消费者无法做到这一点 - 它不了解依赖关系的生命周期:它可以与其他消费者共享,在这种情况下破坏性地过早处置它

那就说一个(LINQ to SQL?)DataContext代表了一个不同的问题,因为它已经实现了IDisposable,你不能很好地改变它,因为它是在BCL中定义的。

您可以为您的存储库正确实现IDisposable,但这意味着您必须为所有存储库和datacontext 匹配生存期

另一种选择是简单地忽略您持有的可支配资源,但如果您这样做,则必须使完全确定 Unity正确处理DataContext时间 - 但由于你计划使用Singleton生命周期,这应该不是问题。

答案 1 :(得分:3)

如果我是你,我会改为执行UnitOfWork模式,或让IOC容器管理DataContext的生命周期。

例如,Structuremap有一个HttpContextScoped选项,所以你可以这样注册你的DataContext:

For<DataContext>().HttpContextScoped().Use<MyDataContext>();

答案 2 :(得分:0)

  

这是否意味着我不应该在存储库上实现IDisposable来清理DataContext?

听起来像是 - 从你所说的,所有存储库将共享相同的DataContext,但你创建的第一个存储库将处置它。

是什么造成了DataContext?不管是什么,都应该处理它。