DDD,BoundedContexts,域事件和事务

|| 我目前正在根据DDD的原则为产品/参与方管理系统创建概念证明。要求之一是,参与者数据(客户,转售商)将存储在Web上的CRM中,而特定于产品的数据将存储在内部的SQL数据库中(请参阅下文)。 CRM系统(基于Web) 客户(包含姓名,地址,电子邮件,联系方式等) 转销商(包含名称,地址,活动状态) 产品系统(本地) BaseProduct(定义香草产品) ResellerProduct(定义将由经销商出售的基本产品的自定义) CustomerProduct(定义客户注册的产品)。 我已经对如何实现解决方案的不同方法进行了大量研究,但是努力理解所有概念以及它们如何应用于我的问题。 我首先将区域划分为2个不同的受限上下文,即Party和Product。我为这些上下文中的每一个定义了域模型,并且在实体中引用其他模型中的概念的地方,我将其保留为简单的Guid ID(即产品域中的CustomerProduct的值将为相关Guid的CustomerRef值)。 然后,我实现了一个Party基础结构实现,该结构使用对Web CRM的API调用,而一个产品基础结构实现则使用NHibernate。对于其中的每一个,我都实现了UnitOfWork,因此我可以在每种情况下控制事务处理过程。应用程序层将在运行时注入两个上下文并使用它们。 例如: ApplicationService.RegisterNewProduct(customerId, 产品编号) 开始交易的每个单位 工作(PartyUnitOfWork.Begin(), ProductUnitOfWork.Begin()) 对每个上下文使用存储库 找到相关的领域对象 (Party.Customer.Find(Id), Product.ResellerProduct.Find(Id)) 执行逻辑以确定是否 客户符合条件,产品符合 有效等 创建一个新的CustomerProduct并保存 到产品系统 提交每个上下文UnitOfWork 然后,我开始进一步探索有限的上下文,并正在考虑重构应用程序,以便每个上下文只能以有限的方式表示彼此的概念,而只是特定于该上下文。即在产品上下文中,我将有一个客户实体,该客户实体具有ID,名称和活动状态,但可能没有联系人首选项等。然后,我将使用DomainEvents协调不同系统之间的活动,以保持其数据为最新状态(例如CRM系统中创建了一个新客户,产品系统将引发并处理一个事件以更新其客户代表)。因此,上面的示例将更改,因此仅使用Product上下文。 为了进一步混淆问题,例如说“ RegisterNewProduct”调用还创建了一个新客户,我是否会在产品系统中创建该客户并引发一个“ NewCustomer”事件,该事件将由Party系统处理? 我有兴趣收集人们对这些想法的评论吗?     
已邀请:
        除了我的评论/问题外,您描述的UnitOfWork方法还有一个基本问题。您将遇到一整类问题,其中一个单元已提交而一个单元却失败了。您将最终获得一个跨越两个上下文的分布式事务。 如果确实需要多个上下文,则一种更好的(主观上)有界上下文的方法是在它们之间进行基于消息的异步通信。您在一个上下文中对聚合执行命令,并且在与将更改持久保存到DB相同的事务中,您发布(例如,通过NServiceBus或MassTransit)消息(事件),表明发生了某些事情。另一个上下文接收消息/事件并做出反应。 如果您是一位纯粹主义者,则可以使用此方法进行所有聚合之间的通信。通过这样做,您可以完全消除拥有工作单元的要求。 有什么意义吗?     

要回复问题请先登录注册