共享实体

可以在一个 WCF RIA Services 应用程序内的若干域服务之间共享实体。客户端可以通过各域服务访问相同的实体类型,只要它们包含在相同的服务器 DLL 内。对共享实体的支持包括基于潜在的不同关联以及各 DomainService 类型中的命名更新方法生成代码。由于能够共享实体,因此可以通过更简便地将实体映射到基础数据模型,促进较大 RIA Services 应用程序的重构与组合。

需要此类共享的情形很常见。例如,考虑如何共享个人员工信息和人力资源 (HR) 员工数据。可以通过员工个人信息 DomainService 公开一个员工实体,其中,员工可以更新其个人信息,例如其地址和电话号码。也可以通过人力资源 DomainService 公开相同的员工类型,其中,假期和工资薪金之类的 HR 信息也显示姓名和 ID 之类的员工实体详细信息。另一个示例是采购服务和目录服务均使用的产品实体。

请注意,仅在单个服务器 DLL 中支持实体共享。数目不定的域服务可能会引用 DLL 边界内的相同实体类型。但不支持跨若干服务器 dll 共享相同的实体类型。有关如何在各服务域之间共享实体的说明,请参见演练:在多个域服务间共享实体主题。

Important 注意:
在 WCF RIA Services V1.0 SP1 中引入了对共享实体的支持,而在 WCF RIA Services V1.0 中则不支持。

客户端实体的形成

通过引入跨多个域服务的实体类型共享,使用某一给定实体类型的每个 DomainService 都会影响在该客户端上是否生成某一服务器实体属性。生成的客户端实体将是一个合并的视图,它包含公开该类型的服务所使用的实体属性。结果是,代码生成器将在可访问应用程序 DLL 内的每个域服务的客户端上创建一个实体类型。通过使用 IncludeAttributeExcludeAttribute 特性也可以影响客户端实体的形成。具有 IncludeAttribute 的服务器实体属性将始终在客户端上反映出来。具有 ExcludeAttribute 的服务器实体属性将永远不会在客户端上反映出来。

具有共享实体的自定义更新方法

域服务中应用了 [Update(UsingCustomMethod = true)] 特性的自定义更新方法将在客户端域上下文中反映出来,并且客户实体将包含与其关联的自定义更新方法。域上下文与域服务具有自然关联,但因为不能共享该实体,所以,用户需要知道在调用自定义更新方法时要使用的域上下文。Intellisense 应提供与此有关的协助。

共享的限制

应该牢记与共享实体有关的三个限制。

  1. 如上所述,仍不支持跨服务器 dll 共享相同的实体类型。

  2. 在某一继承层次结构中,如果共享层次结构的分支,则必须共享该层次结构的相同级别。

  3. 共享特定实体类型的所有 DomainService 对象必须对该类型的元数据说明达成一致。这意味着,针对该服务的任何自定义 DomainServiceDescriptionProvider 对象都必须为该类型指定相同的元数据。