我们正在努力成为 SOA 企业……
给定更新成员详细信息的三个选项,我们如何设计合同?
业务流程非常简单。客户致电(或自己登录)并更新他们的个人详细信息,以便我们获得最新的详细信息。客户雇主还可以提供成员详细信息(这将是批量的 - 一次可能是 1000 个)。这样我们就可以在未来与他们正确沟通。我们有多个后端系统。
详情如下:
- 电话号码,
- 地址,
- 电子邮件,
- 姓名或公司名称,
- 联系人,
- 税号,
- 婚姻状况
- 吸烟者身份
就目前而言,业务规则是: 如果已经提供了有效的税号,则不能再次提供。(可以覆盖)如果存在有效的地址详细信息,雇主无法更新它们,只能在第一次提供。
选项 1: 一项操作,Member.UpdateDetails
- 只需创建和管理一项服务。
- 如果业务规则增长,这项服务的凝聚力可能会降低。
- 有必须区分指定应该删除的东西和保持原样的问题。
- 单一工作单元,单一事务。
选项2: 分解为四个操作:Member.UpdateContactDetails;Member.ProvideTaxFileNumber; 成员.UpdateName; Member.UpdateDemographics
- 潜在地简化了单个操作 - 将复杂性分散到四个操作中。
- 仍然存在必须区分指定应删除某些内容与保持原样的问题。例如,如果我只想指定吸烟者身份而不指定婚姻状况怎么办。
- 需要一些深入的分析来弄清楚如何正确地对它们进行分组——凝聚力取决于业务流程。
- 编写和维护更多服务。
- 事务成为一个问题 - 调用者处理多个事务?
选项3: 分解成更小的仍然:Member.UpdateAddress;Member.UpdateBusinessDetails; Member.UpdateContactNumbers; Member.UpdateContactPerson;Member.UpdateEmailAddress; Member.UpdateMailingAddress; Member.UpdatePhysicalAddress; 等等
- 消除了必须区分指定应删除的内容与保持原样的问题。
- 业务规则可以在任何操作中轻松演变。
- 需要编写和维护的大量服务。
- 事务成为一个问题 - 调用者处理了许多事务?
- 开始看起来像属性设置器/CRUD - 显然不行。
在选项一或二中,假设呼叫者只想更新家庭电子邮件地址 - 我不能指望客户完成整个消息 -客户是否将所有其他标签都排除在外? 处理这个问题的公认的、明显的、直观的模式是什么?
如果这确实是模式,那么客户端如何清除该字段或将其设置为 null? 在.NET 中,在服务器代码中,我看不到区分未提供和空值的明显方法。由于这并不明显,我希望这不是一个可接受的模式。