2

可以说我有分布式架构(客户端-服务器)。在客户端有ServerEntity类,在客户端有它的ClientEntity类。我希望ClientEntity只是从ServerEntity请求一些数据。我最近开始学习 DDD 方法,实际上我喜欢领域事件,所以我选择了它。这是我对未来实施的简化期望:

  1. ClientEntity 创建命令 RequestDataCommand 并发布它(例如通过 MessageBus)
  2. 客户端的 ApplicationLayer 获取此命令,将其连接起来并发送到服务器
  3. Server 的 ApplicationLayer 接收命令并将命令推送到 MessageBus
  4. ServerEntity 接收命令并发布带有一些数据的域事件
  5. 服务器的 ApplicationLayer 获取此事件,连接它并发送到客户端
  6. 客户端的 ApplicationLayer 接收事件并将命令推送到 DomainEventManager
  7. ClientEntity 订阅了该事件,当接收到它时,它会更改一些内部状态。

上述方法的缺点是我们最终会得到几十个命令类。

另一方面,还有另一种选择:我们创建一些域服务接口,如 IRequestDataService,并将其作为 ClientEntity 的依赖项。因此我们不需要创建命令类并将其传递给消息总线,我们只需从 IRequestDataService 调用适当的方法。来自服务器的响应作为域事件被接收,就像前面的例子一样。

第二种方法的缺点是我们使用服务只是发送命令,在我看来应该只执行同步操作。

哪种方法更好,我认为客户端-服务器通信的正确方法是什么?

4

1 回答 1

0

您的 RequestDataCommand 在我看来不像是命令。

命令是使用 UL 的命令式指令,它会更改系统的状态。请求数据不会改变状态,所以它不应该是一个命令。

您的第二种方法遇到了类似的问题。对 IRequestDataService 的调用不应更改服务器上的状态。没有状态变化意味着不应该触发任何事件,至少在“正常” DDD 中是这样。

我的印象是,您正在尝试使用您拥有的基础设施(事件、消息总线,...)来做一些您不应该做的事情。

在我看来,对于读取数据,更好的选择是绕过大部分领域逻辑,以最简单直接的方式读取数据。看看 CQRS(http://martinfowler.com/bliki/CQRS.html是一个好的开始)

于 2016-01-11T12:40:52.490 回答