代码之家  ›  专栏  ›  技术社区  ›  Sunny

带一次性物品的DI

  •  2
  • Sunny  · 技术社区  · 14 年前

    假设我的知识库类如下所示:

    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?

    有关于这些项目的指导吗?

    编辑: 数据上下文 -singleton-根据Web请求将其读取为singleton

    3 回复  |  直到 14 年前
        1
  •  4
  •   Mark Seemann    14 年前

    一般来说, 摘要 依赖关系 不应从IDisposable派生 因为它是一个 泄漏提取 . 依赖项可能包含也可能不包含非托管资源依赖项 混凝土 实施。在任何情况下, 容器应管理生存期 ,所以这不是由消费者决定的-它不知道依赖关系的生命周期:它可以与其他消费者共享,在这种情况下 破坏过早处置 其中。

    也就是说,a(linq to sql?)DataContext代表另一个问题,因为它已经实现了IDisposable,并且您不能很好地更改它,因为它是在BCL中定义的。

    您可以为存储库正确实现IDisposable,但这意味着您必须 匹配寿命 用于所有存储库和数据上下文。

    另一种选择是简单地忽略你持有的是一次性资源,但是如果你这样做,你将不得不 绝对肯定 这种统一在适当的时间正确地处理数据上下文——但是由于您计划使用单例生存期,这不应该是一个问题。

        2
  •  3
  •   Luhmann    14 年前

    如果我是你,我也会 UnitOfWork 或者让IOC容器管理数据上下文的生存期。

    例如,structuremap有一个httpContextScoped选项,因此您可以这样注册DataContext:

    For<DataContext>().HttpContextScoped().Use<MyDataContext>();
    
        3
  •  0
  •   Tim Robinson    14 年前

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

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

    什么创造了 数据上下文 ?不管是什么,它都应该处理掉。