【问题标题】:Entity fetched from a webservice: how to integrate in DDD model?从 Web 服务获取的实体:如何集成到 DDD 模型中?
【发布时间】:2013-04-25 08:57:53
【问题描述】:

我有一个带有复杂模型的“流程”应用程序(此处简化)。该应用程序具有这样的网络服务:

Webservice             | Application behind webservice
------------------------------------------------------
ProcessDTO             | Process
    .getLabel()        |     .getLabel()
                       |     .getSubComponents()
                       |     .execute(input) // calls ProcessComponent.execute
                       | ProcessComponent
                       |     .execute(input)
ProcessService         | ProcessRepository
    .findProcess(id)   |     .findProcess(id)
    .executeProcess(..)|

问题是:如何使用此网络服务将Process 实体集成到应用程序中?


我正在考虑创建一个Process 实体,而不是直接使用 DTO 作为实体。

例如,在另一个应用程序中,我的Module 有一个Process

我可以连接到我的 ORM,所以“关联”部分不是问题。问题是Module 如何执行一个进程?

  • 通过调用ProcessService:这很难看,因为我最终会得到一个不提供任何域逻辑的贫血进程实体。此外,这会使Module 实体使用服务,这不太好对吧?

  • 通过在Process 中添加execute() 方法?但是实体方法也调用了一个不好的服务

【问题讨论】:

    标签: web-services service domain-driven-design entity soa


    【解决方案1】:

    在 DDD 中,外部 Web 服务应由 anti-corruption layer (ACL) 封装。在 ACL 中,Web 服务的 DTO 契约应该映射到本地定义的值对象。

    就调用外部服务而言,这应该由托管相应用例的application service 来完成,而不是由您观察到的实体来完成。

    【讨论】:

    • "DTO 应该映射到 VO" > 我正在映射到一个实体:我看不出带有身份的 Process 怎么可能是 VO?我错过了什么?
    • 而且我没有看到在域层中具有ProcessService 的接口的问题,在架构层中由命中 Web 服务的服务实现?鉴于您所说的,您将如何处理我的问题?我无法想象一个解决方案。
    • 您也可以映射到实体,但请记住,实体的身份是持久的。外部 DTO 是否会作为本地实体持续存在?如果是这样,那么您可以映射到一个实体。否则,映射到瞬态实体是没有意义的。调用封装流程服务的接口确实没有问题。我的意思是,实现需要调用外部服务的用例的应用程序服务应该调用服务,而不是任何实体。
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2011-01-23
    • 2011-07-19
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多