2016-07-28 129 views
1

在我的應用服務,我有以下用於發佈域事件中的代碼:凡訂閱域事件

var document = await dbContext.Documents.GetAggregateAsync(message.DocumentId); 

publisher.SubscribeTo<DocumentOwnerChanged>() 
    .UsingDelegate(
     async a => await messageGateway.DocumentOwnerChanged(1, 1, 1)); 

document.ChangeOwner(message.OwnerId); 

await dbContext.SaveChangesAsync(); 

await publisher.Publish(document.ReleaseEvents()); 

我試圖決定我是否喜歡有應用程序服務中發佈事件的這方面的知識或者如果我應該將這個外部化在根的某個地方更高。

想法?

回答

3

您通常會在組合根中註冊處理程序,除非您必須根據其他消息動態註冊和取消註冊處理程序。

有解決此here

一些討論,你會發佈域事件通常在業務層:

public void SomeDomainBehaviour() 
{ 
    // do something domain-y 
    DomainEvents.Publish(new DomainEvent()); 
} 

吉米·博加德討論發佈域活動here

+0

的其他方式感謝你我更喜歡返回/存儲事件,而不是靜態發佈者。 – Marco

+0

吉米的文章很棒。在那篇文章中,我採用了基於他的模式。我唯一的個人質疑是,它允許多個聚合參與單個交易。我已經開始更多地選擇最終的一致性,如果你在覆蓋開始時調用base.Save()調用,然後調度你的事件,那麼Jimmy的文章仍然適用。也就是說,IMO是一種比異步調度更好的解決方案。處理程序可以異步執行,但我想知道是否無法個人發佈事件。 –