第三方肥皂供应商&清洁架构

时间:2016-03-17 15:32:03

标签: architecture domain-driven-design hexagonal-architecture

我们正在设计一个具有干净/六边形架构范例的应用程序,但我们是新手。所以我们有一些问题。

场景是:

  • 我们有一个外部SOAP服务,它向我们提供了一些“实体”信息和相关的“文档”
  • 对于每个实体,申请必须:
    • 将所有实体文档存储在CMS上(内容和一些实体属性)
    • 使用存储的文档参考
    • 将实体存储在DDBB上

让我们看看我们关于类似Java的方法的初始解决方案:

实体和文件

class Entity {
  private String id;
  // other attributes ... 
  private Document xml; 
  private Document pdf; 
  // some business logic
}

class Document {
  private long id;
  //other attributes
  InputStream getStream() {...}
}

域层的FRepositori抽象

class EntityRepositori {
  Entity create(Entity entity);
  ...
}

域层的DocumentRepositori抽象

class DocumentRepositori {
  Document create(Document document)
  ...
}

SOAP服务的应用层的外部抽象

class ExternalService {
  List<Entity> getEntities();
  ...
}

应用层的用例实现

class IncorporateEntityUseCase {
  IncorporateFUserCase(EntityRepositori, DocumentRepositori, ExternalService){...}
  void incorporate() {
    List<Entity> entities = externalService.getEntities();
    for (Entity entity : entities) {
        Document xml = dRepository.create(entity.getXmnl());
        Document pdf = dRepository.create(entity.getPdf());
        entity.setXml(xml);
        entity.setPdf(pdf);
        entityRepository.create(entity);
    }
  }
}

问题

  1. 关于ExternalService,用它来定义它的抽象是正确的 实体和文档还是必须返回一些UseCase实现将转换为实体的ValueObject?
  2. 关于Document,我们必须将其设计为聚合根并从实体中删除Document对象引用吗?

1 个答案:

答案 0 :(得分:1)

简短版本:尝试将您的任何第三方服务视为另一个网关(或&#34;存储库&#34;)。

我自己刚刚遇到过这个完全相同的问题(想想一个用户将文档作为更大的域对象的一部分上传的系统&#34;调查问卷&#34;然后解析它们),我最终采用的方法是外部api /解析器(或者在你的情况下,第三方SOAP服务)实际上只是另一个网关。即:文件传入(通过网页上传),从webapi控制器发送到交互器,通过网关传输(当前作为流,但与传递到数据库网关/存储库的方式相同) - 处理它们的地方,结果作为实体模型返回。因此,Interactor有一个数据库网关和一个文档解析器网关,它们都返回可用的域模型。