我正在考虑构建一个应用程序,其中系统的主要输入之一将是实时计时值。
我希望使用DDD,因为我相信我的模型有足够的复杂性来保证它,但有点不确定如何构建。存储库是获取数据的方法,但我看到的每一个引用都将其定义为基于拉取的。ie当我想要数据时,我会向存储库索取,它会为您返回一个实体/聚合根。在我的情况下,我将有用于设置聚合根的存储库,但我需要在没有任何请求的情况下更新其中的实体。
我的解决方案是定义一个域服务,聚合根调用该域服务来启动计时。人们觉得这是正确的做法吗?
如果服务是正确的做法,人们对其责任有何看法。它应该知道聚合根并随着滴答作响的实体改变其状态,还是应该只是盲目地推送数据,而聚合根本身知道它正在以这种方式接收数据——监听它并在接收数据时相应地更新?
任何指点/评论/火焰都表示感谢。
Rx是一种通过使用状态相互隔离的组合子来抽象状态和关联的方法。Rx中唯一具有可变性的地方是在使用Subject时。因此,通常情况下,改变对象并发送它已经改变的通知并不是很有效(那么重新进入呢?)
如果您有许多不同的服务,那么Pub/Sub系统是不错的。发布可以从多个点进行,可以组合成一个流,并且在特定流上可能有许多订阅者。
我发现DDD中的概念与Rx配合得很好。虽然Asti很好地支持不变性,但最终大多数应用程序都需要在某个地方进行突变。我发现,如果你能分离出你的突变发生的地方,那么这是一个很好的中间立场。
接下来,我建议数据序列(Rx流)应该包含不可变的数据。拥有突变数据的序列可能很难处理。
考虑到这一点,我们现在可以有一个Arch,存储库将聚合根返回给您。聚合根可以调用服务,这些服务提供数据序列,最好是值类型。您的聚合根现在可以将任何域逻辑应用于传入数据(可能包括更改其自身状态)。
所以我想你的工作流程会看起来像
- 消费者从存储库请求AggRoot
- 存储库使用工厂来创建或重新实例化AggRoot
- AggRoot在创建时注入服务
- 消费者随后调用AggRoot上的一些功能
- 这会调用底层服务以获取序列
- AggRoot订阅序列并处理这些数据