我目前正试图用DDD构建一个系统,以了解它在实践中是如何工作的。我可能在思考几个问题时遇到了困难,这些问题大多与有限上下文的工作方式有关,也许我对DDD的理解很差。
该系统是以后一个更大系统的演示,但它基本上包含一个单一的功能,即发货计划(真正的版本将包含大量与物流相关的功能)。货物是聚合根。货件本身只包含诸如装运号和实际交货日期等详细信息,但它还包含以下实体:
运输订单,包含发货人/收货人信息和一些订单特定重量相关的properties.
。
现在,我希望能够在不同的角度创建这些实体(运输订单和运输),与实际的装运计划无关。此视图允许您创建、更新或删除任何和所有传输订单和传输,crud样式,因此装运行为不在这些视图中。在“装运计划”视图中按下“附加运输”或“附加运输订单”后,运输或运输订单实际上将加载到货件上,因此它们只在加载后才输入此上下文:Shipment.AttachTransport(Transport transport)
类似于运输订单,对于传输订单也是如此。
对于运输和运输订单都使用CRUD是否有意义?我是否可以使用AR中使用的相同的类来创建和更新CRUD中的传输和传输订单?我是不是错过了DDD的重点?运输和运输订单都可以在系统中存在,而不需要父货件。
发布于 2022-10-06 01:29:55
据我所知,您将有三个聚合根:TransportOrder
、Transport
和Shipment
。
“对于运输和运输订单都使用CRUD是否有意义?”
如果没有比CRUD更有趣的行为,那么肯定。
“是否可以使用AR中使用的相同类来创建和更新CRUD中的传输和传输订单”
不,TransportOrder
或Transport
在Shipment
中生活是没有意义的,因为它们没有它就可以存在,还因为它会使Shipment
在结构上依赖于它的事务边界,因为Shipment
并不拥有这些数据--它不是它的事务边界的一部分。但是,您可以通过ID对关系进行建模。
你要问自己的问题是:
Transport
附加到Shipment
时必须强制执行哪些规则/不变量。你能把Transport
附加到多批货上吗?有限度吗?TransportOrder
s附加到Shipment
时必须强制执行哪些规则/不变量?例如,一个Shipment
只能附加一个TransportOrder
吗?
如果已经附加到
TransportOrder
被修改(甚至删除),那么会发生什么呢?应该允许这样做吗?这些问题的答案最终将驱动您的模型,因为模型将针对处理命令&保护不变量进行优化。如果您有跨越多个AR边界的规则,那么事情就变得更加具有挑战性。您要么必须考虑更大的边界,修改每个事务不止一个AR,要么甚至接受您的模型最终保持一致。
一个例子
作为一个具体的例子,让我们说,您拥有的唯一规则是“TransportOrder
不能附加到多个Shipment
”。
如果您使用如下的Shipment
集合来建模TransportOrder
,那么该模型将不允许您强制执行TransportOrder
没有附加到另一个Shipment
。此外,从Shipment
建模的一对多关系是无用的,因为在Shipment
中没有不变量可强制执行。
一个更有用的模型可能是倒转关系并对TransportOrder
上的附加行为进行建模。这样,TransportOrder
就可以强制执行唯一不能附加到超过一个Shipment
的规则。
很明显,事情会变得更加棘手,你可能会问,“如果Shipment
被取消了,会发生什么?”
这里有多个答案:
Shipment
的TransportOrder
,并且必须手动重新附加?。
ShipmentCancelled
事件并取消订单。操作将取消装运,并在单个cancelShipment
中取消附加TransportOrder
正如您所看到的,建模的可能性是无穷无尽的,这使得DDD问题在没有特定领域知识的情况下很难回答,但希望我的回答帮助您走上正确的轨道。
https://stackoverflow.com/questions/73909279
复制相似问题