【问题标题】:Linq Datacontext and "unit of work"Linq Datacontext 和“工作单元”
【发布时间】:2011-01-02 23:22:39
【问题描述】:

现在 Linq 中的流行语是“工作单元”。 如“仅在一个工作单元中保留您的数据上下文”,然后将其销毁。

我对此有几个问题。

  1. 我正在创建胖客户端 WPF 应用。所以我的数据上下文需要跟踪当前屏幕上用户可用的整个实例化对象网络。我什么时候可以销毁我的数据上下文?
  2. 随着时间的推移,我根据用户的操作及其与第一个数据上下文对象的交互来构建 linq 查询。如何创建新的 DataContext 并在新的 Context 上执行查询?

我希望我很清楚。 谢谢

【问题讨论】:

    标签: wpf linq multithreading datacontext


    【解决方案1】:

    工作单元不同于只为一个工作单元保留数据上下文。

    工作单元是一种设计模式,描述了如何以抽象的方式表示事务。它实际上只需要创建、更新和删除 (CUD) 操作。

    一种理念是 UoW 用于所有 CUD 操作,而只读存储库用于读取操作。

    在任何情况下,我都建议将对象生命周期与 UoW 或存储库使用分离。使用 Dependency Injection (DI) 将两者都注入到您的消费服务中,并让 DI 容器管理两者的生命周期。

    在 Web 应用程序中,我的经验是对象上下文应该只在单个请求(每个请求的生命周期)内保持活动状态。另一方面,对于像您描述的那样的富客户端来说,让它长时间保持活动可能更有效(单例生命周期)。

    通过让 DI 容器管理对象上下文的生命周期,您不会将自己束缚在一个特定的选择上。

    【讨论】:

      【解决方案2】:

      我正在创建一个胖客户端 WPF 应用程序。

      好的。

      所以我的数据上下文需要跟踪当前屏幕上用户可用的整个实例化对象网络。

      没有。这些类是数据库映射类。它们不是 UI 表示类。


      如何创建新的 DataContext 并在新的 Context 上执行查询?

      Func<DataContext, IQueryable<Customer>> queryWithoutADataContext =
        dc =>
          from cust in dc.Customers
          where cust.name == "Bob"
          select cust;
      
      Func<DataContext, IQueryable<Customer>> moreFiltered =
        dc =>
          from cust in queryWithoutADataContext(dc)
          where cust.IsTall
          select cust;
      
      var bobs = queryWithoutADataContext(new DataContext);
      var tallbobs = moreFiltered(new DataContext);
      

      【讨论】:

      • 感谢您的第 2 部分,它非常有帮助
      • 通过将 dc 实例封装为代表,您不会冒提前处置这些实例的风险吗?在延迟执行的情况下,需要存在 dc 实例对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2012-10-25
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多