ドメイン イベント パターンを調べて、この件に関する多くのリソースを読みましたが、要件を満たす適切な実装方法が見つかりません。基本的に、単純な 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 アプリケーションで実装を呼び出す方法がわかりません。
任意の提案をいただければ幸いです。