首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DDD:在AR之外创建的概念,但随后附加(Crud.?)

DDD:在AR之外创建的概念,但随后附加(Crud.?)
EN

Stack Overflow用户
提问于 2022-09-30 13:07:49
回答 1查看 87关注 0票数 0

我目前正试图用DDD构建一个系统,以了解它在实践中是如何工作的。我可能在思考几个问题时遇到了困难,这些问题大多与有限上下文的工作方式有关,也许我对DDD的理解很差。

该系统是以后一个更大系统的演示,但它基本上包含一个单一的功能,即发货计划(真正的版本将包含大量与物流相关的功能)。货物是聚合根。货件本身只包含诸如装运号和实际交货日期等详细信息,但它还包含以下实体:

运输订单,包含发货人/收货人信息和一些订单特定重量相关的properties.

  • transport (拖车或其他运输车辆)、运输尺寸和登记号

现在,我希望能够在不同的角度创建这些实体(运输订单和运输),与实际的装运计划无关。此视图允许您创建、更新或删除任何和所有传输订单和传输,crud样式,因此装运行为不在这些视图中。在“装运计划”视图中按下“附加运输”或“附加运输订单”后,运输或运输订单实际上将加载到货件上,因此它们只在加载后才输入此上下文:Shipment.AttachTransport(Transport transport)类似于运输订单,对于传输订单也是如此。

对于运输和运输订单都使用CRUD是否有意义?我是否可以使用AR中使用的相同的类来创建和更新CRUD中的传输和传输订单?我是不是错过了DDD的重点?运输和运输订单都可以在系统中存在,而不需要父货件。

EN

回答 1

Stack Overflow用户

发布于 2022-10-06 01:29:55

据我所知,您将有三个聚合根:TransportOrderTransportShipment

“对于运输和运输订单都使用CRUD是否有意义?”

如果没有比CRUD更有趣的行为,那么肯定。

“是否可以使用AR中使用的相同类来创建和更新CRUD中的传输和传输订单”

不,TransportOrderTransportShipment中生活是没有意义的,因为它们没有它就可以存在,还因为它会使Shipment在结构上依赖于它的事务边界,因为Shipment并不拥有这些数据--它不是它的事务边界的一部分。但是,您可以通过ID对关系进行建模。

你要问自己的问题是:

  • 在将Transport附加到Shipment时必须强制执行哪些规则/不变量。你能把Transport附加到多批货上吗?有限度吗?

  • 在将TransportOrders附加到Shipment时必须强制执行哪些规则/不变量?例如,一个Shipment

只能附加一个TransportOrder吗?

如果已经附加到

  • 上的TransportOrder被修改(甚至删除),那么会发生什么呢?应该允许这样做吗?

  • Etc.

这些问题的答案最终将驱动您的模型,因为模型将针对处理命令&保护不变量进行优化。如果您有跨越多个AR边界的规则,那么事情就变得更加具有挑战性。您要么必须考虑更大的边界,修改每个事务不止一个AR,要么甚至接受您的模型最终保持一致。

一个例子

作为一个具体的例子,让我们说,您拥有的唯一规则是“TransportOrder不能附加到多个Shipment”。

如果您使用如下的Shipment集合来建模TransportOrder,那么该模型将不允许您强制执行TransportOrder没有附加到另一个Shipment。此外,从Shipment建模的一对多关系是无用的,因为在Shipment中没有不变量可强制执行。

一个更有用的模型可能是倒转关系并对TransportOrder上的附加行为进行建模。这样,TransportOrder就可以强制执行唯一不能附加到超过一个Shipment的规则。

很明显,事情会变得更加棘手,你可能会问,“如果Shipment被取消了,会发生什么?”

这里有多个答案:

  • 可能会在异常报告中标记附加到已取消的ShipmentTransportOrder,并且必须手动重新附加?

  • 可能有一个自动补偿操作,它将触发ShipmentCancelled事件并取消订单。

  • 也许最终的一致性不是一个选项,并且需要很强的一致性,在这种情况下,您可以决定通过一个域服务在同一个事务中修改多个ARs。例如,transaction.

操作将取消装运,并在单个cancelShipment中取消附加TransportOrder

正如您所看到的,建模的可能性是无穷无尽的,这使得DDD问题在没有特定领域知识的情况下很难回答,但希望我的回答帮助您走上正确的轨道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73909279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档