3

这是我第一次将 DDD 概念应用于现实世界的问题。

由于项目相对较小,我只从 1 个有界上下文开始。然而,我发现自己拥有几乎相同的类,即非常相似的名称、非常相似的属性但不同的行为。我开始认为它们实际上属于不同的有界上下文,因为实体是相同的,只是在不同的上下文中具有不同的含义。应用程序基本上有两个完全不同的用户组这一事实支持了这一点。

我已经阅读了一些关于不同限界上下文中的两个实体如何相互通信的内容。我想我理解这个概念......但不知道如何实施?某处有.net示例吗?即一个有界上下文中的聚合根将事件发布到另一个有界上下文中的聚合根?以及在另一个有界上下文中调用聚合根的聚合根。

每个有界上下文都应该有自己的:服务层吗?存储库和数据层?

4

2 回答 2

2

这可能有助于引用 Vaughn Vernon 的实施领域驱动设计。

“也许领域事件最常见的用途是当聚合创建事件并发布它时。发布者驻留在模型的模块中,但它不对某些方面进行建模。相反,它为聚合提供简单的服务,需要将事件通知订阅者。”

事件是使用服务发布的,处理程序的实现取决于模型其余部分最终保持一致的可接受时间。根据我的特殊要求,时间上的小延迟是可以接受的。我的域事件使用 MSMQ 发布到队列,然后在外部进程中我从队列中读取并执行工作。这种设计允许我将这项工作卸载到外部主机并释放 IIS。我使用相同的机制将更改持久保存到存储中。当我的聚合事务完成时,我将提交的事件发布到 MSMQ,并在多播上有 2 个队列。一个队列用于处理额外的工作,另一个用于持久性。

如果你还没有读过,我强烈推荐这本书。我相信我的设计会带来一些批评,但您的实现将取决于您的要求以及您对使用最终一致性的舒适程度。

希望这会有所帮助,如果您决定使用 MSMQ,这里有一个链接可以帮助您入门。 http://msdn.microsoft.com/en-us/library/aa480407.aspx

这是我对域事件发布者的实现。

public class DomainEventPublisher
{
    string DomaineEventMessageQueue = @"FormatName:MULTICAST=234.1.1.1:8001";

    public void PublishEvent(DomainEvent domainEvent, string correlationId)
    {
        MessageQueue eventQueue;

        eventQueue = new MessageQueue(DomaineEventMessageQueue);

        Message message = DomainEventMessage.CreateDomainEventMessage(domainEvent);

        message.CorrelationId = correlationId;

        eventQueue.Send(message);
    }

}
于 2014-11-27T13:27:18.367 回答
2

所以我有4种可能性给你。

  1. 重新访问您的域模型:您需要在聚合之间进行通信的事实可能表明模型存在问题。这里的关键是有界上下文中的所有内容都保持一致,但聚合之间没有保证。

  2. 使用流程管理器(或 SAGA):与上面的答案类似,您可以响应域事件并协调来自流程管理器的交叉聚合通信。

  3. 注入服务:要小心这个服务,因为你想在你的域中放置一个高级的没有或很少的依赖项。话虽如此,它可能仍然是解决问题的正确或最实用的方法。

  4. 改变你的观点:在交互之前你是否已经拥有来自其他聚合的信息?如果是这样,是否可以通过任何命令传递而无需通信?

我在我的博文中详细介绍了这个主题。如果你觉得它有帮助,你可以从这里得到它:事件源系统中聚合间通信的 4 个秘密

于 2014-12-03T11:57:19.670 回答