1

起初我们有一个模型

class Person extends EntityBase<Person, PersonNumber>{
 private PersonNumber personNumber;
 private String name;
 private Contact contact;
 private String educationLevel;
}
class Contact extends ValueObjectBase<Contact> {
  private String phone;
  private String address;
  private String contactPerson;
}

但是现在我们必须与另一个系统名称“System DC”整合,原来的人表被拆开,personNumber,name,phone,address列现在移动到“System DC”。并且“SystemDC”提供了一个数据库视图“DC_PersonView”给我们查询。如果我们需要创建一个人,我们必须从“SystemDC”调用webservice。

所以我们定义一个 personDTO 像

 class PersonDTO{
 private PersonNumber personNumber;
 private String name;
 private String phone;
 private String address;
 }

计划一:

  1. 将 person 重构为 IPerson 接口
  2. 定义一个 PersonWrape 类

    class PersonWrape implements IPerson {
     private Person person;
     private PersonDTO personDTO;
    }
    
  3. 在 PersonWrape 存储库中

    void SavePerson(IPerson person) {
      systemDC.saveWebservice(person.getPersonDTO);
      personRepository.save(person);// map the column not in systemDC like  educationLevel to our person table.
      }
    

方案2:只修改personRepository:

    void SavePerson(IPerson person) {
      PersonDTO personDTO = PersonDTO.fromEntiry(person);
      systemDC.saveWebservice(personDTO);
      personRepository.save(person);// map the column not in systemDC like  educationLevel
      }

但是查询人会很麻烦..

在这种情况下我们如何建模?请给我们一些建议。

4

2 回答 2

1

使用 DTO 并且在使用 SOA 时不暴露域模式非常好。其他任何事情最终都会变得一团糟(尝试在客户端应用程序中使用域模型)。

然而,问题在于您尝试将域模型公开为 CRUD SOA 服务。您不能让 SOA 服务更改任意实体的任何字段。它必须遵循域模型以及您在其中定义的方法和服务。

例如。如果您在User类中有一个被调用的方法,CalculateAge那么创建一个被调用的 SOA 方法CalculateUserAge,而不是一个被调用的方法UpdateUser

于 2012-12-04T07:29:40.297 回答
0

似乎您在两个有界上下文(BC)之间有一个集成场景。在这些场景中,通常可以识别可以确定实体更改如何传播的关系 BC。

在您的用例中,您似乎有一个人的单一概念(每个人在 BC 之间共享一个身份),但是您有 2 个不同的 BC,其中一个人是清单的,每个 BC 包含和管理不同的人数据。那么你讨论的save操作其实就是两个save操作,每个BC一个。每个 BC 保存它感兴趣的信息。如果您有一个用例,例如接受两个 BC 的人员信息的 UI 表单,则该用例应该将保存命令显式发送到两个 BC。您的计划 2 最接近这种方法,但是我不会将该代码放在存储库中。相反,我会直接从表示层或应用层调用两个不同的服务。

您还可以考虑的是您的原始 BC (我们称之为A)和 System DC之间是否存在某种下游关系。例如,如果DC位于 A 的下游以获取人员数据,那么您可以实现事件驱动的方法,而不是在保存期间显式调用这两个服务。通过这种方法,A将发布有关人员数据更改的事件,并且ADC之间的集成点将订阅这些事件并在DC中进行适当的修改。请注意,这种方法通常是最终一致的. 总体而言,事件驱动的方法更复杂,但也更灵活。

于 2012-12-06T17:31:11.997 回答