65.9K
CodeProject 正在变化。 阅读更多。
Home

客户端域上下文加载管理器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (6投票s)

2012 年 2 月 8 日

CPOL

3分钟阅读

viewsIcon

26501

downloadIcon

795

Entity Framework 领域上下文的实体查询加载管理器。

引言

在处理需要从不同的、相互连接的领域上下文进行大量查询的多个解决方案的过程中,我需要一种机制来了解所有查询何时完成。

这主要是因为无法在服务器上进行包含 (include),因为数据位于物理上不同的数据库中,并且引用是在客户端添加的。 这使得它更加重要,因为导航属性用于用户控件上的绑定,因此必须锁定,直到数据可用为止。

MultiSyncQueryLoader

MultiSyncQueryLoader 是包装类,负责通知所有查询已成功完成。 它的编写方式允许您使用与对领域上下文进行正常查询相同的机制,但使用 AddQuery 方法代替。

为了表示我应有的敬意,我的同事 Robin Marshall 添加了默认上下文和 LoadBehaviour 属性,以允许从领域上下文进行简化的查询。

最终,可以使用加载器通过两种方式查询数据:异步和同步(或者至少是异步但按顺序排列)。

RunSync 方法是为这样一种场景设计的:一个查询的回调需要先通过一个查询加载数据,然后才能实际运行该回调。

RunAsync 方法将更常用于在 Silverlight / Entity Framework 环境中运行的日常查询。 它的设计目的是同时将所有查询触发到相关服务,并等待响应。

当所有查询完成加载时,每个查询都会通过 Completed 事件通知。

DomainContextQuery<T>

DomainContextQuery<T> 泛型是所有魔力发生的地方。 它的工作是针对关联的 DomainContext 运行 EntityQuery,并通知发起者它已完成。

Run(Action) 方法负责运行同步调用,因为我们不需要为监听调用者传递 userstate 变量来知道实际运行的是哪个 DomainContextQuery

但是,异步调用需要 Run(Action<object>) 方法。 这是为了我们可以扩展该方法以使用调用它的 DomainContextQuery(如果需要)。

每种方法都会将 DomainContextQuery 标记为 Complete,以便 MultiSyncQueryLoader 可以快速检查是否有任何未完成的查询,如果没有,则触发 Completed 事件。

Using the Code

为了解释代码的用法,我将使用随附演示解决方案中的摘录

MultiSyncQueryLoader loader = new MultiSyncQueryLoader(context, LoadBehavior.MergeIntoCurrent);
loader.AddQuery(context.GetCustomersQuery(), (callback) => CustomersLoaded = true);
loader.AddQuery(context.GetCategoriesQuery(), (callback) => CategoriesLoaded = true);
loader.AddQuery(context.GetCustomerDemographicsQuery(), (callback) => CustomerDemographicsLoaded = true);
loader.Completed += () => CompleteLoaded = true;

// Run the queries in any order
loader.RunAsync();

// Run the queries in the defined order above
// loader.RunSync();

要利用该代码,只需创建查询加载器的实例(如果需要,可以使用默认领域上下文和加载行为)。 使用该方法添加每个查询。 AddQuery 方法的设计方式不会干扰原始代码。

例如,在查询加载器之前,从领域上下文加载可能如下所示

context.Load(context.GetCustomersQuery(), LoadBehavior.MergeIntoCurrent, callback => { }, null) 

现在,使用 AddQuery 方法(并且未指定默认上下文)

loader.AddQuery(context,context.GetCustomersQuery(), LoadBehavior.MergeIntoCurrent, callback => { } , null);

持续开发

此项目未来的任何开发都将在 Github 上维护。 我将始终尝试在文章中放置一个最新的版本,但最好始终检查一下。

© . All rights reserved.