【发布时间】:2011-09-30 01:29:04
【问题描述】:
我有一个模式,它定义了一个 事件 记录,用于在发布/订阅方案中的两个系统之间传递消息。该事件包括一个“有效负载”元素 event_data,其中包含消息的详细信息。复杂之处在于有效负载可以是 30 多种类型中的任何一种,每种类型都在自己的 XSD 中定义。
例如(精简):
<event>
<event_name>new_phone_number</event_name>
<event_data>
<areacode>303</areacode>
<number>555-1212</number>
<extension>31</extension>
</event_data>
</event>
在这种情况下,event_data 的类型为 phone_number,它在导入的 XSD 中的其他地方定义。但我想做的是使用相同的机制来承载其他类型的结构化消息数据。例如,可能是换工作事件,定义为 job_details 类型:
<event>
<event_name>new_job</event_name>
<event_data>
<job_title>CEO</job_title>
<start_date>01/01/2012</start_date>
<location>Main Office</location>
</event_data>
</event>
存储在 event_data 元素中的内部记录属于 job_details 类型,在导入的 XSD 中定义。 event 类型的“外部”记录只不过是承载“内部”记录中包含的有效负载的一种方式。
到目前为止,我已经研究了三种方法来解决这个问题,每种方法都有问题:
使用列出所有可能记录类型的“选择”结构。问题似乎是 xml/xsd 让选择列表中的所有条目共享相同的元素名称是不自然的。
我想与其尝试在 event_data 元素中包含结构化子记录,我可以简单地使用一个可选属性来反映每种可能的子记录类型。当然,每个都有一个唯一的名称,因此您将有一个 new_phone_number 的属性,一个 new_job 的属性,依此类推。除了这里潜在的可维护性和丑陋问题外,我不确定如何强制在给定的事件实例中传递一个且只有一个属性。我可以忍受,但这会使代码变得脆弱。
有人通过建议使用联合来回答类似的问题 - 但这似乎仅适用于简单类型。不会涵盖我的用例。
难倒!有什么指导吗?
【问题讨论】: