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

WCF SOA 模式: 有限集本地主数据

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.14/5 (3投票s)

2009年12月9日

CC (ASA 2.5)

4分钟阅读

viewsIcon

15106

使用 WCF 的企业 SOA 模式解释如何处理本地主数据

类别 服务设计
范围 技术
参考 配对类型

设计案例研究

在注册客户详细信息时,作为地址详细信息的一部分,系统 A 要求输入地址类型,该类型可以是家庭、工作或度假地址。

问题

每个应用程序都依赖于主数据集合。有些对业务至关重要,有些则是业务可选的。例如,一套国家信息或多或少被所有垂直领域的系统使用,但一套健康问题对医疗保健领域的临床系统至关重要。“邮政地址类型”就是这样一种主数据,用于在销售管理系统中指定给定的客户地址是其工作、家庭还是度假地址,该系统用于与用户通信或直接拜访客户。

主数据应该在系统、地理和语言之间可理解。它通常是代码值。例如,“IN”是印度的 ISO 国家代码值。处理国家数据的企业系统应使用此代码或其他国家代码值,以确保系统互操作性。用户界面层将此代码值解析为实际值,该值可能是英语或其他任何语言。这在医疗保健应用中尤为重要,例如,患者的健康问题需要作为健康标准代码进行持久化,因为在一个地理区域使用的术语在另一个区域可能无法理解。标准编码系统有助于解决此互操作性问题。SNOMED CT、HL7 是医疗保健领域编码标准的示例。定义包含主数据项作为代码类型的服务的数据合同很重要,该代码类型包含代码系统和代码值。由服务使用者负责将这些代码值解析为适当的描述。

系统中存在一些主数据,基于这些主数据,系统的行为由其驱动。使用具有值的代码系统会降低实现逻辑的可读性,并且逻辑可能不直接。这会导致应用程序域状态不一致。我们以销售管理系统为例,验证某个地址是家庭还是工作地址的逻辑,代码将是

if(addressType.CodeSystem == "CodeSystemA" &&
addressType.CodeValue == "Home")
{
 // do the logic
}

在这里,逻辑检查代码系统是否为“CodeSystemA”且值为“Home”。基于此,实现了一些行为。示例中,由开发人员负责编写代码值(此处为“Home”)的右侧字面量。相反,如果一个包含这些值集的库会强制开发人员仅使用有意义的代码值。

约束

  • 代码可读性和可维护性
  • 服务实现中的语义行为

解决方案

总的来说,企业系统的主数据可以分为三种类型

  1. 有限的本地主数据集
  2. 有限主数据集
  3. 无限全局主数据集

“有限的本地主数据集”示例

  • 通讯地址类型 - 家庭、度假、工作
  • 患者生存状况 - 在世、已故
  • 婚姻状况 - 单身、已婚

“有限主数据集”示例

  • 国家/地区 - 印度、美国、英国
  • 健康问题 - 乙型肝炎、流感

“无限全局主数据集”示例

  • 消费者/用户可维护数据

有限的本地集包含对系统行为起主要作用的数据,通常是状态字段或条件语句中使用的字段。例如,在个人护理管理系统中,个人护理员根据地址类型和主要地址决定在哪里拜访患者。与有限集或无限全局集不同,这些数据集除了物理数据存储之外,还需要存在于内存中,以便可以直接使用底层语言约定在代码中访问。NET 中的System.Enum类型允许提供内存数据存储,这

  1. 避免不必要的物理数据库调用来获取代码值
  2. 使业务逻辑更具语义性和可读性,而不是更具讽刺性
  3. 以本地和面向对象格式存储

在问题部分提供的示例中,为CodeSystemA中定义的地址类型创建SysAAddressType enum。这将使代码如下

if(addressType == SysAAddressType.Home)

 // do the logic

然而,如问题部分所述,不建议将这些enum类型作为服务定义的数据合同的一部分。因此,需要代码值和相应的enum值之间的映射。

参考文献

本文来自我在 http://www.udooz.net/article/6-patterns-for-enterprise-soa-using-wcf.html 的原创系列。

© . All rights reserved.