asp.net-mvc – 在哪里提出持久性依赖的域事件 – 服务,存储库或
我的ASP.NET MVC3 / NHibernate应用程序需要触发和处理与我的域对象相关的各种事件。例如,Order对象可能有像OrderStatusChanged或NoteCreatedForOrder这样的事件。在大多数情况下,这些事件导致发送电子邮件,所以我不能把它们留在MVC应用程序。
我阅读了Udi Dahan的Domain Events和几十个其他想法如何做这种事情,我决定使用基于NServiceBus的主机处理事件消息。我做了一些概念验证测试,这似乎工作很好。 我的问题是什么应用层应该实际引发的事件。我不想触发事件,直到有问题的对象已成功持久化(如果持久性失败,则无法发送电子邮件,说明已创建注释)。 另一个问题是,在某些情况下,事件绑定到聚合根下面的对象。在上面的示例中,通过将注释添加到Order.Notes集合并保存该订单来保存注释。这提出了一个问题,它使得很难评估当保存订单时应该触发的事件。我想避免在保存更新的副本之前必须拉取对象的当前副本并查找差异。 >是否适合UI提出这些事件?它知道发生了什么事件,并且只有在成功地让服务层保存对象后才能触发它们。关于控制器触发域事件似乎是错误的。 更新 我最后做的是,在我在下面(way below)发布的答案,是在我的域实体建立一个EventQueue属性,它是一个List< IDomainEvent> ;.然后我添加了事件作为域的变化值得它,这允许我保持在域内的逻辑,我相信是适当的,因为我基于事件发生在一个实体内的事件。 然后,当我在我的服务层持久化对象时,我处理该队列,并实际将事件发送到服务总线。最初,我计划使用使用身份PK的遗留数据库,所以我不得不后期处理这些事件来填充实体的ID,但我最终决定切换到Guid.Comb PK,它允许我跳过步。 解决方法
我的解决方案是,你在域层和服务层引发事件。
您的网域: public class Order { public void ChangeStatus(OrderStatus status) { // change status this.Status = status; DomainEvent.Raise(new OrderStatusChanged { OrderId = Id,Status = status }); } public void AddNote(string note) { // add note this.Notes.Add(note) DomainEvent.Raise(new NoteCreatedForOrder { OrderId = Id,Note = note }); } } 您的服务: public class OrderService { public void SubmitOrder(int orderId,OrderStatus status,string note) { OrderStatusChanged orderStatusChanged = null; NoteCreatedForOrder noteCreatedForOrder = null; DomainEvent.Register<OrderStatusChanged>(x => orderStatusChanged = x); DomainEvent.Register<NoteCreatedForOrder>(x => noteCreatedForOrder = x); using (var uow = UnitOfWork.Start()) { var order = orderRepository.Load(orderId); order.ChangeStatus(status); order.AddNote(note); uow.Commit(); // commit to persist order } if (orderStatusChanged != null) { // something like this serviceBus.Publish(orderStatusChanged); } if (noteCreatedForOrder!= null) { // something like this serviceBus.Publish(noteCreatedForOrder); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – GetExternalLoginInfo在Google OWIN提供程序上返
- asp.net – 在Response.Redirect()之后调用Response.End()
- asp.net-core-signalr – 在ClientSide上获取SignalrR Conn
- asp.net mvc 依赖注入Ninject
- TempData知多少
- asp.net – 使用Active Directory的REST API的授权方法
- 跨项目分发ASP.NET用户控件的技术
- asp.net – 检查控制启动的AJAX请求
- asp.net-mvc-3 – 来自控制器的ASP.NET MVC3 View的物理位置
- 将变量从ASP.net传递给JavaScript
- asp.net – 使用OLEDB读取CSV文件,即使连接字符串
- asp.net-core – 如何为所有视图设置布局,基类和
- asp.net-mvc – 如何在ASP.NET MVC中测试动作过滤
- asp-classic – 经典asp中的串联字符串
- Asp.Net MVC – 重载动作方法
- asp.net-mvc-3 – MVC3 Webgrid Paging在Jquery对
- asp.net – 使用响应对象生成PDF时的预加载器
- asp.net-mvc – 如何在ASP.NET MVC中定义视图级变
- asp.net核心 – 如何在自己的主机环境中的ASP.NE
- asp.net-mvc – 如何从ASP MVC5中的属性路由获取