为多个订户提升域事件

时间:2013-03-16 12:59:05

标签: c# domain-events

我正在讨论域事件模式,并且已经阅读了很多关于这个主题的资源,但我找不到实现我们要求的好方法。基本上我们有一个服务/域层,它使用简单的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应用程序中调用实现。

任何建议都将不胜感激。

1 个答案:

答案 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的事件发布者/订阅者部分。