问题标签 [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.
asp.net-mvc - 将 Ninject 与 Udi Dahan 的领域事件一起使用
我在 MVC 项目中使用 Ninject 并尝试按照 Udi Dahan 的模式实现域事件http://www.udidahan.com/2009/06/14/domain-events-salvation/
在下面的摘录中,“容器”用于解析已引发的特定类型事件的所有事件处理程序。
我的问题(如果我遗漏了一些基本的东西,请道歉)是如何用 Ninject 做到这一点?换句话说:
如何在这个静态类中设置“容器”?
一旦我有了一个容器(内核?),解析所有事件处理程序的 Ninject 语法是什么(我假设我必须事先在服务模块中注册)?
我一直在帖子中阅读应该只使用构造函数注入,并且一切都可以递归地解决,并且访问 Ninject Kernel 是一个禁忌。因此,任何有关如何做到这一点的建议将不胜感激。
文章摘录
architecture - DomainEventHandler 应该在哪一层?
我想使用Udi Dhahan提出的领域事件模式 我的应用程序有以下几层:
UI -> 分布式服务 -> 应用程序服务 -> 域 -> 数据层。
领域层负责引发领域事件。负责处理事件的领域事件处理器应该在哪一层?
asp.net - 如何在多层应用程序中连接域事件处理程序
所以我的问题与这个问题非常相关:使用存储库和实体框架的领域事件中的实体持久性?
编辑:关于该主题的更好的讨论也在这里:在哪里引发依赖于持久性的域事件 - 服务、存储库或 UI?
但是,假设我采用了正确的方法,我的问题会更加简单和技术性。
假设我有以下项目:
引发事件时(例如,已授予组成员资格),则应做两件事(在两个不同的层中):
- 持久化数据(在数据库中插入新的组成员记录)
- 为相关用户创建通知(与 UI 相关)
我将举一个我在简介中写的最后一个参考的简单示例:
领域层有以下代码:
假设通风处理程序位于 MyApplicationLayer 中(以便能够与服务层对话)。它有以下代码:
线入是如何发生的?我猜是结构图,但是这个输入代码看起来如何呢?
distributed-system - 分布式系统 (DDD) 中的领域事件和命令
可以说我有分布式架构(客户端-服务器)。在客户端有ServerEntity类,在客户端有它的ClientEntity类。我希望ClientEntity只是从ServerEntity请求一些数据。我最近开始学习 DDD 方法,实际上我喜欢领域事件,所以我选择了它。这是我对未来实施的简化期望:
- ClientEntity 创建命令 RequestDataCommand 并发布它(例如通过 MessageBus)
- 客户端的 ApplicationLayer 获取此命令,将其连接起来并发送到服务器
- Server 的 ApplicationLayer 接收命令并将命令推送到 MessageBus
- ServerEntity 接收命令并发布带有一些数据的域事件
- 服务器的 ApplicationLayer 获取此事件,连接它并发送到客户端
- 客户端的 ApplicationLayer 接收事件并将命令推送到 DomainEventManager
- ClientEntity 订阅了该事件,当接收到它时,它会更改一些内部状态。
上述方法的缺点是我们最终会得到几十个命令类。
另一方面,还有另一种选择:我们创建一些域服务接口,如 IRequestDataService,并将其作为 ClientEntity 的依赖项。因此我们不需要创建命令类并将其传递给消息总线,我们只需从 IRequestDataService 调用适当的方法。来自服务器的响应作为域事件被接收,就像前面的例子一样。
第二种方法的缺点是我们使用服务只是发送命令,在我看来应该只执行同步操作。
哪种方法更好,我认为客户端-服务器通信的正确方法是什么?
event-handling - 没有 CQRS 的领域事件和版本控制
嗨,我有以下 senario,我不明白如何获得最终的一致性:
- 用户 1 使用基于任务的 ui 更改客户名称
- 应用服务调用聚合上的操作
- 客户名称上的聚合触发事件已更改
- 总线使用 nservicebus 发送消息
- NServicebus 服务终止
- 用户 2 获得聚合并调用更改地址
- 聚合操作称为
- 触发域事件
- 信息放在公共汽车上
- 巴士重新启动
- 消息 2 最先收到
- 消息 2 已处理,其他有界上下文已更新为新地址
- 现在收到消息 1,这是错误的顺序
- 现在会发生什么
在 13 中如果我们在事件中传递聚合的版本会不会出现乐观并发错误?
如果是这样,消息 1 new 将应用于其他上下文中的对象。我们如何保持一致性?
这是阻止我在我的域中应用事件的问题。欢迎大家帮忙。
基本思想是在另一个上下文中更新另一个聚合。我只是停留在这个并发技术上。
我们没有在命令处理程序和总线上推送命令的意义上使用事件源或 CQRS。这只是我们希望异步发生的事件处理,因为我们有一个我们不希望更改的现有设计。
布莱尔
c# - 为多个订阅者引发域事件
我说要研究领域事件模式并阅读了很多关于该主题的资源,但我找不到满足我们要求的好方法。基本上,我们有一个服务/域层,它使用简单的 CQRS 实现包装用于读取/写入的存储库层。我们有一个使用此服务/域层的 ASP.NET Mvc 应用程序。整个应用程序与 Autofac 绑定在一起,我希望发生以下情况:
当通过在服务层上调用say“CreateNews”来创建新闻项目时,将需要引发一个事件,如下所示:
这一切都发生在事务中,我不想在保存完成之前真正引发事件,所以在我们的保存更改方法中我想这样做:
然后在我们的 ASP.NET Mvc 应用程序中,我想要一个 IHandler 的实现,如下所示:
我无法弄清楚如何从 save 方法引发此事件并在 Web.Mvc 应用程序中调用实现。
任何建议,将不胜感激。
c# - 具有工作单元模式的实体框架和 ADO.NET
我们有一个使用 Entity Framework 5 构建的系统,用于创建、编辑和删除数据,但我们遇到的问题是有时 EF 太慢或者根本无法使用实体框架(基于用户参与为表构建数据的视图在数据库中的某些组等中),我们必须使用存储过程来更新数据。
但是我们遇到了一个问题,我们必须将更改保存到 EF 以便将数据保存在数据库中,然后调用存储过程,我们不能使用 ITransactionScope,因为它总是提升为分布式事务和/或在事务期间锁定表以进行选择。
我们还尝试引入一个 DomainEvents 模式,它将事件排队并在保存更改后引发它们,因此我们在数据库中拥有我们需要的数据,但最终我们可能会导致第一部分成功而第二部分失败。
是否有任何好的方法来处理这个问题,或者我们是否需要在这种情况下完全摆脱 EF?
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 的依赖。
我现在会这样做,但希望能找到一个更好的长期解决方案。
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/
domain-driven-design - CQRS 和同步操作(如用户注册)
我正在采用 DDD 概念来设计我们的下一个项目,更具体地说是 CQRS。
在阅读了很多东西之后,我现在正在尝试实现一个简单的概念证明。
问题是我刚开始就被卡住了:p
我正在尝试将此方法应用于简单的用户注册过程,其中步骤是:
- 用户填写注册表并提交请求
- 应用程序创建用户
- 该应用程序对用户进行身份验证(自动登录)
- 应用程序向用户发送验证电子邮件
- 该应用程序使用确认消息将用户重定向到其他地方
从实现的角度来看,到目前为止我得到的是:
- 控制器操作将请求数据映射到 RegisterCommand 对象
- 控制器动作要求命令总线处理 RegisterCommand
- 命令处理程序(UserService)“注册”方法创建一个新的用户对象(无论是通过新命令还是工厂对象)
- 模型引发 RegisterEvent
- 命令处理程序要求存储库存储新的用户对象
就是这样,控制器操作对此一无所知。
所以,我的猜测是,由于这个上下文中的所有事情都必须同步完成(除了电子邮件发送),我可以使用直接/同步命令总线,并且在控制器操作中,在命令总线调用之后,我可以查询对于只读用户(查询数据库),如果它存在,则假设一切顺利,所以我可以给用户一条确认消息。
由事件处理程序处理的自动登录过程。
假设这是正确的,如果出现问题怎么办,如何以正确的信息通知用户?
我们可以在互联网上找到的文章中经常使用一个常见的例子:客户使用过期的信用卡支付订单。系统接受请求,通知用户一切正常,但用户在几分钟后收到一封电子邮件,告诉他他的订单无法处理。
好吧,这种情况在许多情况下是可以接受的,但对于其他一些情况,这是不可能的。那么处理这些用例的例子在哪里呢?:p
谢谢 !