问题标签 [domain-events]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2000 浏览

asp.net-mvc - 将 Ninject 与 Udi Dahan 的领域事件一起使用

我在 MVC 项目中使用 Ninject 并尝试按照 Udi Dahan 的模式实现域事件http://www.udidahan.com/2009/06/14/domain-events-salvation/

在下面的摘录中,“容器”用于解析已引发的特定类型事件的所有事件处理程序。

我的问题(如果我遗漏了一些基本的东西,请道歉)是如何用 Ninject 做到这一点?换句话说:

  1. 如何在这个静态类中设置“容器”?

  2. 一旦我有了一个容器(内核?),解析所有事件处理程序的 Ninject 语法是什么(我假设我必须事先在服务模块中注册)?

我一直在帖子中阅读应该只使用构造函数注入,并且一切都可以递归地解决,并且访问 Ninject Kernel 是一个禁忌。因此,任何有关如何做到这一点的建议将不胜感激。

文章摘录

0 投票
1 回答
142 浏览

architecture - DomainEventHandler 应该在哪一层?

我想使用Udi Dhahan提出的领域事件模式 我的应用程序有以下几层:

UI -> 分布式服务 -> 应用程序服务 -> 域 -> 数据层。

领域层负责引发领域事件。负责处理事件的领域事件处理器应该在哪一层?

0 投票
2 回答
1213 浏览

asp.net - 如何在多层应用程序中连接域事件处理程序

所以我的问题与这个问题非常相关:使用存储库和实体框架的领域事件中的实体持久性?

编辑:关于该主题的更好的讨论也在这里:在哪里引发依赖于持久性的域事件 - 服务、存储库或 UI?

但是,假设我采用了正确的方法,我的问题会更加简单和技术性。

假设我有以下项目:

引发事件时(例如,已授予组成员资格),则应做两件事(在两个不同的层中):

  1. 持久化数据(在数据库中插入新的组成员记录)
  2. 为相关用户创建通知(与 UI 相关)

我将举一个我在简介中写的最后一个参考的简单示例:

领域层有以下代码:

假设通风处理程序位于 MyApplicationLayer 中(以便能够与服务层对话)。它有以下代码:

线入是如何发生的?我猜是结构图,但是这个输入代码看起来如何呢?

0 投票
1 回答
571 浏览

distributed-system - 分布式系统 (DDD) 中的领域事件和命令

可以说我有分布式架构(客户端-服务器)。在客户端有ServerEntity类,在客户端有它的ClientEntity类。我希望ClientEntity只是从ServerEntity请求一些数据。我最近开始学习 DDD 方法,实际上我喜欢领域事件,所以我选择了它。这是我对未来实施的简化期望:

  1. ClientEntity 创建命令 RequestDataCommand 并发布它(例如通过 MessageBus)
  2. 客户端的 ApplicationLayer 获取此命令,将其连接起来并发送到服务器
  3. Server 的 ApplicationLayer 接收命令并将命令推送到 MessageBus
  4. ServerEntity 接收命令并发布带有一些数据的域事件
  5. 服务器的 ApplicationLayer 获取此事件,连接它并发送到客户端
  6. 客户端的 ApplicationLayer 接收事件并将命令推送到 DomainEventManager
  7. ClientEntity 订阅了该事件,当接收到它时,它会更改一些内部状态。

上述方法的缺点是我们最终会得到几十个命令类。

另一方面,还有另一种选择:我们创建一些域服务接口,如 IRequestDataService,并将其作为 ClientEntity 的依赖项。因此我们不需要创建命令类并将其传递给消息总线,我们只需从 IRequestDataService 调用适当的方法。来自服务器的响应作为域事件被接收,就像前面的例子一样。

第二种方法的缺点是我们使用服务只是发送命令,在我看来应该只执行同步操作。

哪种方法更好,我认为客户端-服务器通信的正确方法是什么?

0 投票
4 回答
847 浏览

event-handling - 没有 CQRS 的领域事件和版本控制

嗨,我有以下 senario,我不明白如何获得最终的一致性:

  1. 用户 1 使用基于任务的 ui 更改客户名称
  2. 应用服务调用聚合上的操作
  3. 客户名称上的聚合触发事件已更改
  4. 总线使用 nservicebus 发送消息
  5. NServicebus 服务终止
  6. 用户 2 获得聚合并调用更改地址
  7. 聚合操作称为
  8. 触发域事件
  9. 信息放在公共汽车上
  10. 巴士重新启动
  11. 消息 2 最先收到
  12. 消息 2 已处理,其他有界上下文已更新为新地址
  13. 现在收到消息 1,这是错误的顺序
  14. 现在会发生什么

在 13 中如果我们在事件中传递聚合的版本会不会出现乐观并发错误?

如果是这样,消息 1 new 将应用于其他上下文中的对象。我们如何保持一致性?

这是阻止我在我的域中应用事件的问题。欢迎大家帮忙。

基本思想是在另一个上下文中更新另一个聚合。我只是停留在这个并发技术上。

我们没有在命令处理程序和总线上推送命令的意义上使用事件源或 CQRS。这只是我们希望异步发生的事件处理,因为我们有一个我们不希望更改的现有设计。

布莱尔

0 投票
1 回答
1451 浏览

c# - 为多个订阅者引发域事件

我说要研究领域事件模式并阅读了很多关于该主题的资源,但我找不到满足我们要求的好方法。基本上,我们有一个服务/域层,它使用简单的 CQRS 实现包装用于读取/写入的存储库层。我们有一个使用此服务/域层的 ASP.NET Mvc 应用程序。整个应用程序与 Autofac 绑定在一起,我希望发生以下情况:

当通过在服务层上调用say“CreateNews”来创建新闻项目时,将需要引发一个事件,如下所示:

这一切都发生在事务中,我不想在保存完成之前真正引发事件,所以在我们的保存更改方法中我想这样做:

然后在我们的 ASP.NET Mvc 应用程序中,我想要一个 IHandler 的实现,如下所示:

我无法弄清楚如何从 save 方法引发此事件并在 Web.Mvc 应用程序中调用实现。

任何建议,将不胜感激。

0 投票
1 回答
390 浏览

c# - 具有工作单元模式的实体框架和 ADO.NET

我们有一个使用 Entity Framework 5 构建的系统,用于创建、编辑和删除数据,但我们遇到的问题是有时 EF 太慢或者根本无法使用实体框架(基于用户参与为表构建数据的视图在数据库中的某些组等中),我们必须使用存储过程来更新数据。

但是我们遇到了一个问题,我们必须将更改保存到 EF 以便将数据保存在数据库中,然后调用存储过程,我们不能使用 ITransactionScope,因为它总是提升为分布式事务和/或在事务期间锁定表以进行选择。

我们还尝试引入一个 DomainEvents 模式,它将事件排队并在保存更改后引发它们,因此我们在数据库中拥有我们需要的数据,但最终我们可能会导致第一部分成功而第二部分失败。

是否有任何好的方法来处理这个问题,或者我们是否需要在这种情况下完全摆脱 EF?

0 投票
1 回答
1940 浏览

c# - 领域事件模式单点队列事件

我在这里提出了一个问题:Raising Domain Events For Multiple Subscribers,答案让我想到了以下模式,我可以像这样拥有 IEventPublisher:

和这样的 IEventSubscriber :

问题是我需要将每个发布者的实例传递给构造函数,如下所示:

理想情况下,我希望能够拥有一个包含任何 IEventPublishers 的通用发布者,这样我就可以调用类似的东西:

我无法弄清楚如何做到这一点,因为我无法传递 IEventPublisher 的集合而不将 T 定义为在此示例中为 ThingyChangedEvent 而我想要的是根据传递给通用发布者的类型来确定发布者.

任何建议都非常感谢。

编辑:

好的,使用下面的答案和这里的一些信息:http ://www.udidahan.com/2009/06/14/domain-events-salvation/我想出了以下内容,但不完全存在:

公共类 EventManager : IEventManager { Autofac.ILifetimeScope _container;

}

我现在可以在由 autofac 解析的构造函数中获取 IEventManager eventManager 的实例,并按如下方式调用它:

这是我不喜欢这个解决方案的地方:

我不想在构造函数中获取 ILifetimeScope 的实例,我希望能够获取 IEventSubscribersProvider 的集合,但如果我要求说,autofac 将无法解决此问题:

如果我将类型传递给 Publish 并调用,我只能解决它:

第二个问题不是什么大问题,但如果能够调用发布而不必像这样传递类型,那就太好了:

我想如果有人对如何解决这两个问题有任何建议,尤其是问题 1,因为我不喜欢在不同的项目中依赖 Autofac。我唯一能想到的是某种类型的管理器类,它明确地接受我需要的东西,如下所示:

非常感谢您的任何建议。

编辑 2

经过大量研究并在运行时查看此 Autofac 通用服务解决方案后,我不确定我能否实现我想要的。我能想出的最佳解决方案是:

然后让 EventManager 在构造函数中使用 IEventSubscribersProviderFactory 以从该项目中删除对 Autofac 的依赖。

我现在会这样做,但希望能找到一个更好的长期解决方案。

0 投票
1 回答
770 浏览

nosql - 将聚合和域事件与 nosql 存储一起使用

我实际上在 DDD 和 NoSql 领域徘徊。我现在有一个疑问:我需要从聚合中生成事件,并且我想使用 NoSql 存储。但是我如何确保事件保存在存储中并且聚合根上的更改没有事务?这有意义吗?有没有办法在不被迫使用事件源或事务数据库的情况下做到这一点?实际上我正在考虑实现一个两阶段提交算法,但从性能的角度来看它似乎很重......我是否以错误的方式解决问题?充满了问题......感谢恩里科的每一个建议

PS我是stackoverflow的新手,所以任何建议/批评/......都非常欢迎Enrico

编辑 1

那么我需要事件来通知聚合发生了一些事情,我他们应该对变化做出反应。当此类事件对业务逻辑很重要时,就会出现问题。据我了解,经过一夜的思考,我不能使用nosql存储来做这样的事情。让我解释一下(大声思考:P):

  • 使用 ES(第一景):我保存数据的“差异”。然后我产生一个与之相关的事件。2 操作。
  • 使用 ES(第二景):我保存数据的“差异”。一个进程,观察 ES 并产生事件。但我只拥有一个观察者进程来确保事件的正确顺序。
  • 使用 ES(3d 场景):幂等事件。事件可以由状态推断,并且事件的每次重新应用只能导致消费者发生一次更改,可以有多个“出队”过程,不可能发生重复。1的操作,但它给消费者带来了很大的限制。
  • 一般来说:我保存聚合的数据。然后我产生一个与之相关的事件。2 操作。

现在问题变得更广泛了恕我直言,当域事件是业务流程的基本部分时,是否可以使用域事件和 nosql?我认为这可能是一个更好的选择关系......即使我需要添加相当多的机器来获得相同的性能。

编辑2 为了完整起见,在google上搜索“域事件nosql幂等”:http: //svendvanderveken.wordpress.com/2011/08/26/transactional-event-based-nosql-storage/

0 投票
2 回答
3076 浏览

domain-driven-design - CQRS 和同步操作(如用户注册)

我正在采用 DDD 概念来设计我们的下一个项目,更具体地说是 CQRS。

在阅读了很多东西之后,我现在正在尝试实现一个简单的概念证明。

问题是我刚开始就被卡住了:p

我正在尝试将此方法应用于简单的用户注册过程,其中步骤是:

  • 用户填写注册表并提交请求
  • 应用程序创建用户
  • 该应用程序对用户进行身份验证(自动登录)
  • 应用程序向用户发送验证电子邮件
  • 该应用程序使用确认消息将用户重定向到其他地方

从实现的角度来看,到目前为止我得到的是:

  • 控制器操作将请求数据映射到 RegisterCommand 对象
  • 控制器动作要求命令总线处理 RegisterCommand
  • 命令处理程序(UserService)“注册”方法创建一个新的用户对象(无论是通过新命令还是工厂对象)
  • 模型引发 RegisterEvent
  • 命令处理程序要求存储库存储新的用户对象

就是这样,控制器操作对此一无所知。

所以,我的猜测是,由于这个上下文中的所有事情都必须同步完成(除了电子邮件发送),我可以使用直接/同步命令总线,并且在控制器操作中,在命令总线调用之后,我可以查询对于只读用户(查询数据库),如果它存在,则假设一切顺利,所以我可以给用户一条确认消息。

由事件处理程序处理的自动登录过程。

假设这是正确的,如果出现问题怎么办,如何以正确的信息通知用户?

我们可以在互联网上找到的文章中经常使用一个常见的例子:客户使用过期的信用卡支付订单。系统接受请求,通知用户一切正常,但用户在几分钟后收到一封电子邮件,告诉他他的订单无法处理。

好吧,这种情况在许多情况下是可以接受的,但对于其他一些情况,这是不可能的。那么处理这些用例的例子在哪里呢?:p

谢谢 !