Linq Datacontext和“工作单位”

时间:2010-01-08 15:42:04

标签: wpf linq multithreading datacontext

现在Linq中的buzword是“工作单位”。 如“只保留一个工作单元的datacontext”,然后销毁它。

我有几个问题。

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

2 个答案:

答案 0 :(得分:1)

工作单元不同,只为一个工作单元保留您的datacontext

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

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

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

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

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

答案 1 :(得分:0)

  

我正在创建一个胖客户端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);