具有DDD和旧版数据的模块化整体式设备

问题描述

在我的域中,我具有以下模块:

WMS(仓库管理) SalesOrder(包含salesorderline等。) 这是一个多租户应用程序,这意味着数据库包含许多公司,每个公司都有自己的数据集。有很多杂物,但很大一部分是可操作的。

某些数据来自旧系统,您将如何在此处进行集成?将有一个运行时间间隔并将数据发送到API,向上和向下写入(保持同步)的集成。所以基本上我在问如何将现有数据导入系统,而这个问题不应该是分布式事务吗?可能还会有其他系统的数据导入。数据需要保持同步的原因是,旧版必须生存更长的时间。

编辑:

Let's say both modules stores it's own version of product:

WMS.Product:
- ProductName
- ProductNumber
- QuantityInStock

SalesOrder.Product:
- ProductName
- ProductNumber
- RetailPrice

Should the integration command look like:

Integration.Commands.SaveProduct
- ProductName
- ProductNumber
- RetailPrice
- QuantityInStock

And shouldn't this transaction be distributed across the different modules?  If the transaction goes both ways there will have to be some kind of link between ids..

当集成必须双向进行时,如何从旧系统中使用上帝模型实现反腐败层。

谢谢。

解决方法

这是我的建议:

您将如何在此处进行集成?

集成就像域的其他任何外部部分一样(例如,数据库)。创建一个“连接器”,其唯一的工作就是与该系统进行交互并将其从您的域转换为该系统,反之亦然。您的域可以联系到的一个“接口”将掩盖交互的详细信息,并在基础结构层上实现。

我在问如何将现有数据导入到系统中...可能还会从其他系统导入数据

如果从系统导入和导出数据的步骤相似,则可以创建一个接口,并创建一个为所有数据导入实现该接口的连接器。

总而言之,将其视为外部系统(因为是外部系统),并像在数据库中一样通过基础结构层对其进行读/写。

编辑: 根据您的修改

更清洁的方法

您需要2个不同的命令。一个更新仓库,另一个更新销售订单。

因此,您将拥有Integration.Commands.PulledProduct和Integration.Commands.OrderProduct,而不是Integration.Commands.SaveProduct。当您销售产品时,您的域本身可能会触发由WareHouseManager模块处理的“拉出产品”事件。您的外部触发器必须能够区分这些命令。 如果采用这种方法,您会发现集成几乎变成了“逻辑”。

无所不在的语言是对此进行思考的一种方式。 SME可能将您的系统描述为“用户下达销售订单(事件1),然后我们从仓库中提取请求的数量(事件2)”。因此,这两个事件在您的域中必须是可区分的。让我知道我是否仍然没有清晰的画面。