asp.net-mvc – 在哪里提出持久性依赖的域事件 – 服务,存储库或UI?
|
我的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);
}
}
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- iis – 禁用应用程序池的空闲超时是否有任何危害?
- asp.net-mvc-4 – 将ninject dependecyResolver用于MVC和We
- asp.net – 如何使用webgrease?
- asp.net – 使用Visual Studio 2015检测gulp中的发布/调试
- asp.net – XMLHTTP请求的经典ASP错误
- asp.net – 如何在web.config的MailSetting部分设置友好的电
- asp.net-web-api – ASP.Net Web API帮助页面:记录复杂类型
- asp.net 文件上传实例汇总
- 如何获取asp.net c#的文章数据
- asp.net-mvc-4 – 无法加载文件或程序集’System.Web.Http.
- asp.net – 实体框架:Singletonish ObjectConte
- asp.net-core – VSTS – 构建ASP.NET Core 2.0应
- asp.net-mvc-3 – 剃刀语法动态命名HTML元素
- asp.net-mvc – warns – html.helpers在项目更新
- 如何保护我的ASP.NET AJAX应用程序?
- 如何为枚举执行asp.net mvc 4模型绑定?
- asp.net-core – asp.net核心身份中的多个SubDom
- asp.net 根据汉字的拼音首字母搜索数据库(附 LIN
- asp-classic – %%和经典asp之间有什么区别?
- asp.net-mvc – HttpContext.Items与ASP.NET MVC
