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






2.14/5 (3投票s)
使用 WCF 的企业 SOA 模式解释如何处理本地主数据
类别 | 服务设计 |
---|---|
范围 | 技术 |
参考 | 配对类型 |
设计案例研究
在注册客户详细信息时,作为地址详细信息的一部分,系统 A 要求输入地址类型,该类型可以是家庭、工作或度假地址。
问题
每个应用程序都依赖于主数据集合。有些对业务至关重要,有些则是业务可选的。例如,一套国家信息或多或少被所有垂直领域的系统使用,但一套健康问题对医疗保健领域的临床系统至关重要。“邮政地址类型”就是这样一种主数据,用于在销售管理系统中指定给定的客户地址是其工作、家庭还是度假地址,该系统用于与用户通信或直接拜访客户。
主数据应该在系统、地理和语言之间可理解。它通常是代码值。例如,“IN”是印度的 ISO 国家代码值。处理国家数据的企业系统应使用此代码或其他国家代码值,以确保系统互操作性。用户界面层将此代码值解析为实际值,该值可能是英语或其他任何语言。这在医疗保健应用中尤为重要,例如,患者的健康问题需要作为健康标准代码进行持久化,因为在一个地理区域使用的术语在另一个区域可能无法理解。标准编码系统有助于解决此互操作性问题。SNOMED CT、HL7 是医疗保健领域编码标准的示例。定义包含主数据项作为代码类型的服务的数据合同很重要,该代码类型包含代码系统和代码值。由服务使用者负责将这些代码值解析为适当的描述。
系统中存在一些主数据,基于这些主数据,系统的行为由其驱动。使用具有值的代码系统会降低实现逻辑的可读性,并且逻辑可能不直接。这会导致应用程序域状态不一致。我们以销售管理系统为例,验证某个地址是家庭还是工作地址的逻辑,代码将是
if(addressType.CodeSystem == "CodeSystemA" &&
addressType.CodeValue == "Home")
{
// do the logic
}
在这里,逻辑检查代码系统是否为“CodeSystemA
”且值为“Home
”。基于此,实现了一些行为。示例中,由开发人员负责编写代码值(此处为“Home
”)的右侧字面量。相反,如果一个包含这些值集的库会强制开发人员仅使用有意义的代码值。
约束
- 代码可读性和可维护性
- 服务实现中的语义行为
解决方案
总的来说,企业系统的主数据可以分为三种类型
- 有限的本地主数据集
- 有限主数据集
- 无限全局主数据集
“有限的本地主数据集”示例
- 通讯地址类型 - 家庭、度假、工作
- 患者生存状况 - 在世、已故
- 婚姻状况 - 单身、已婚
“有限主数据集”示例
- 国家/地区 - 印度、美国、英国
- 健康问题 - 乙型肝炎、流感
“无限全局主数据集”示例
- 消费者/用户可维护数据
有限的本地集包含对系统行为起主要作用的数据,通常是状态字段或条件语句中使用的字段。例如,在个人护理管理系统中,个人护理员根据地址类型和主要地址决定在哪里拜访患者。与有限集或无限全局集不同,这些数据集除了物理数据存储之外,还需要存在于内存中,以便可以直接使用底层语言约定在代码中访问。NET 中的System.Enum
类型允许提供内存数据存储,这
- 避免不必要的物理数据库调用来获取代码值
- 使业务逻辑更具语义性和可读性,而不是更具讽刺性
- 以本地和面向对象格式存储
在问题部分提供的示例中,为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 的原创系列。