2

我说要研究领域事件模式并阅读了很多关于该主题的资源,但我找不到满足我们要求的好方法。基本上,我们有一个服务/域层,它使用简单的 CQRS 实现包装用于读取/写入的存储库层。我们有一个使用此服务/域层的 ASP.NET Mvc 应用程序。整个应用程序与 Autofac 绑定在一起,我希望发生以下情况:

当通过在服务层上调用say“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 应用程序中调用实现。

任何建议,将不胜感激。

4

1 回答 1

3

我想我有一个如何为您执行此操作的示例,而且我碰巧也在使用 MVC 和 AutoFac!在我的具体示例中,我专注于命令/查询分离,但这样做我必须实现域事件模式。

首先阅读这篇博文,以便您了解事物如何组合在一起以及代码的外观: http ://www.nootn.com.au/2013/03/command-query-separation-to-better .html

因此,我建议安装DotNetAppStarterKit.Web.Mvc NuGet 包,然后查看Global.asax 文件,了解如何注册您需要的所有组件。您可以仔细阅读 SampleMvc 应用程序,了解诸如Event Subscribers之类的内容。

我希望这对您有所帮助,并让您快速上手。您可以只使用 DotNetAppStarterKit 的事件发布者/订阅者部分,而无需使用命令和查询。

于 2013-03-25T11:33:57.990 回答