領域事件中涉及的實體可能還沒有持久化呀?

2102x2發表於2013-08-21
Domain event 乍看起來好像解決了一切問題, 用起來也很簡單, 就像Udi Dahan什麼的演示的那樣。
但是現在有一個具體問題,不知道如何解決了:在ctor或者工廠方法中引發事件,由於涉及到的聚合當時還沒有被持久化,handler中就沒法訪問相應的聚合了;甚至,如果是自動生成id的話,那時候id還不存在,連傳遞id也不行。

一些`hack`思路:
* 手動生成id
* (在app層)使用aop在事務結束的時候統一Dispatch所有在domain中收集到的事件
但是感覺比較猥瑣,不知道各位大神有沒有比較“權威”的做法?(No CQRS & EventSourcing)

class User
{
  private String id
  //xxoo....
  public Message postMessageToUser(String toWhom_id, String what)
  {
    def msg = new Message(toWhom_id, what)
    //Q: 在這裡引發事件,但是此時msg還沒有被持久化
    EventBus.instance.fire([msgId: msg.id, what: what, from:this.id] as MessagePostedEvent)
  }
}

//============================
class MessagePostedEventHandler
{
  @Inject private UserRepository userRepo
  @Inject private MessageRepository msgRepo

   //假定我們需要在handler裡面獲取相關聚合根的詳細資訊(只讀)
  //Q:不管handler是同步還是非同步,都不能保證相關的實體已經持久化了,就可能無法載入了
  public void handle(@Observes @Sync MessagePostedEvent e)
  {
    def sender = userRepo.load(e.from)
    def msg = msgRepo.load(e.id)
    println "user $sender posted a message: $msg"
  }
}
<p class="indent">

相關文章