我最近采用了域驱动设计原则,但是我在实现有界上下文以及上下文和/或其他系统之间的集成方面遇到了一些麻烦. 例如,采用以下系统: 仓库/库存系统 实体将包括“产品”,其中包含“
例如,采用以下系统:
仓库/库存系统
实体将包括“产品”,其中包含“数量”,“位置”等属性
在线订购系统
实体将包括’Order’,’OrderLine’和’Basket’.它是否也有自己的产品实体,其中包含“价格”等属性?
订购系统的一个明确的业务规则是,不能为缺货的产品下订单,但此信息在库存保管系统中.根据我的理解,这些是实现这一点的一些可能方式:
>当订单被验证时,Order对象调用Stock Keeping System中的服务以检查每个所需产品是否有足够的库存.但是,对于调用另一个系统的应用程序服务的域,某些事情并不合适,并且如果所有系统都这样做,则会导致所有内容紧密耦合在一起.
>订购系统从库存保管系统的数据库中读取:订购系统中的产品实体映射到订购系统中的产品表和库存保留系统中的产品表或订购系统产品实体的连接包含另一个名为StockKeepingProduct的实体,该实体具有Stock Keeping System的值.这很容易执行验证,但必须确保订购系统永远不会写入Stock Keeping System的数据库.
>库存数量被非规范化到订购系统的数据库中,每当库存系统的库存发生变化时,它会向订购系统发送一条消息来更新其库存.
可能在内心深处,我知道我应该做3,但我不确定我们是否已经准备好处理如此多的冗余数据和可能的不一致性.你对1和2有什么看法?或者您还有其他建议吗?
这一切都取决于基础设施.如果您在一个网络中运行了2个系统,因此通信中断的可能性很小,我没有看到解决方案1的问题.您可以将对Stock ieping System的调用包装到适配器中,以便将来轻松交换,以防您决定更改股票保管系统的API或系统完全如此.同时也避免将其细节泄漏到订购系统中.解决方案3更先进,需要更多资源来实施和维护,但允许完全分离这两个系统.更好地处理网络中断或性能瓶颈,例如订购系统需要处理比Stock Keeping System可以处理的更多请求.
但同样可以实现与1)相同的方式 – 使用适配器分离.恕我直言从DDD的角度来看没有区别.