繁体   English   中英

DI与一次性物品

[英]DI with disposable objects

假设我的存储库类如下所示:

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单例-将其作为每个Web请求的单例读取

通常, 抽象依赖项不应从IDisposable派生 ,因为它将是Leaky Abstraction 依赖项可能取决于也可能不持有非托管资源, 具体取决于具体实现。 在任何情况下, 容器都应该管理生存期 ,因此,它不是由使用者来决定的-它不了解依赖项的生命期:它可以与其他使用者共享,在这种情况下,过早处置将具有破坏性它的。

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

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

另一种选择是简单地忽略您持有的是一次性资源,但是如果这样做,则必须绝对确保 Unity在适当的时候正确处置了DataContext-但由于您计划使用Singleton一生,这应该不是问题。

如果您是我,那么我将改为执行UnitOfWork模式实现,或者让IOC容器管理DataContext的生存期。

例如,Structuremap具有HttpContextScoped选项,因此您可以像这样注册DataContext:

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

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

听起来很像-按照您的意思,所有存储库将共享相同的DataContext ,但是您创建的第一个存储库将对其进行处理。

是什么创建DataContext 不管是什么,它都应该处理掉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM