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






4.71/5 (6投票s)
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 上维护。 我将始终尝试在文章中放置一个最新的版本,但最好始终检查一下。