2010-01-08 79 views
4

现在Linq中的buzword是“工作单元”。 如“只保留一个工作单元的数据上下文”然后将其销毁。Linq Datacontext和“工作单元”

那么我有几个关于这个问题。

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

我希望我很清楚。 谢谢工作

回答

0

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

好的。

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

不。那些类是数据库映射类。他们不是UI演示课程。


如何创建一个新的DataContext并执行新的上下文查询?

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); 
+0

感谢您对第2部分 这是非常有益的 – Rabbi 2010-01-10 13:28:07

+0

你不通过封装他们作为代表运行DC实例早处置的风险?在延迟执行的情况下,直流实例需要存在吗? – 2010-06-20 08:08:05

1

单位是不一样的只是保持你的datacontext存在了工作的一个单元。

工作单元是一种描述如何以抽象方式表示事务的设计模式。这只是创建,更新和删除(CUD)操作所必需的。

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

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

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

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