我正在讨论域事件模式,并且已经阅读了很多关于这个主题的资源,但我找不到实现我们要求的好方法。基本上我们有一个服务/域层,它使用简单的CQRS实现包装存储层以进行读/写。我们有一个ASP.NET Mvc应用程序,它使用这个服务/域层。整个应用程序与Autofac捆绑在一起,我想要发生的是以下内容:
当通过在服务层寄存器上调用“CreateNews”来创建新闻项时,需要引发一个事件:
public void CreateNews(Domain.Entities.News.NewsBO news)
{
ValidateBusinessObject(news);
var entityNews = AutoMapper.Mapper.Map<Repositories.Entities.News.News>(news);
NewsCommandRepository.Create(entityNews);
_domainEventManager.Register<NewsCreatedDomainEvent>(x => x.News = news);
}
这一切都发生在一个事务中,我不想在保存完成之前实际提出事件,所以在我们的保存更改方法中我想这样做:
public void SaveChanges()
{
_repoCommandManager.SaveChanges();
_domainEventManager.RaiseEvents();
}
然后在我们的ASP.NET Mvc应用程序中,我希望有一个IHandler的实现,如下所示:
public class NewsCreatedDomainEventCacheHandler : IHandles<Project.Services.Domain.Events.News.NewsCreatedDomainEvent>
{
public void Handle(Services.Domain.Events.News.NewsCreatedDomainEvent @event)
{
// In here we would update the cache or something else particular to the web layer
}
}
我无法弄清楚如何从save方法中提升此事件并在Web.Mvc应用程序中调用实现。
任何建议都将不胜感激。
答案 0 :(得分:3)
我想我有一个如何为你做这个的例子,我碰巧也在使用MVC和AutoFac!在我的具体示例中,我专注于命令/查询分离,但在这样做时,我必须实现域事件模式。
首先阅读这篇博文,以便您了解事物如何挂在一起以及代码是什么样的: http://www.nootn.com.au/2013/03/command-query-separation-to-better.html
所以我建议安装DotNetAppStarterKit.Web.Mvc NuGet package,然后查看Global.asax file,了解如何注册所需的所有组件。您可以仔细阅读SampleMvc应用程序,例如Event Subscribers。
我希望这有助于让你快速上升。您可以在不使用命令和查询的情况下使用DotNetAppStarterKit的事件发布者/订阅者部分。