2012-04-09 81 views
0

我們在我們的應用中使用事件採購,並且也嚴格需要跟蹤對我們許多對象發起更改的用戶。目前,我們有這樣在域對象中訪問會話

class Order { 
    setNameBy(newname, User user) { 
    applyChange(new OrderRenamed(user.id, newname)); 
    } 
    : 
} 

代碼,因爲我們大部分的方法是這樣的,他們都被稱爲像這樣

setNameBy("a new name", SessionContext.currentUser) 

我們打算在那裏訪問域對象內部的SessionContext。即:

setNameBy(newname, User user) { 
    applyChange(new OrderRenamed(user.id, newname)); 
} 

成爲

setName(newname) { 
    applyChange(new OrderRenamed(SessionContext.currenUser.id, newname)); 
} 

我個人比較喜歡後一種方法的簽名,因爲它的接縫,另一方面更自然的感覺有點亂來訪問SessionContext域對象內。

那麼如何在DDD/CQRS應用程序中最好地處理會話數據呢?訪問Domain對象中的SessionContext是否可以,或者是否應該使用其他方法(如事件豐富)將此信息添加到從域發出的事件中?

回答

2

如果跟蹤發起更改的用戶頻繁發生,則SessionContext成爲解決方案的固有部分,因此IMO成爲阻力最小(足夠好的解決方案)的路徑。也許對UserContext的改寫會使它看起來不像是一個「髒」的技術耦合? :)

我經常在我的應用程序中使用線程綁定上下文(事件源和不是),並且如果SessionContext.currentUser在SessionContext未綁定到線程時拋出異常,那麼它也可以在測試過程中幫助發現錯誤(至少它對我來說)。

替代方案可能是將事件標記爲需要用戶跟蹤(例如,使用界面),然後再豐富事件。這對我來說感覺更加麻煩,並且可能會使解決問題更困難,因爲未綁定的SessionContext異常將發生在需要用戶信息的業務功能之外。

這兩個解決方案都是IMO足夠好的解決方案,所以它主要是您希望耦合到SessionContext的地方。

2

我更願意讓我的域模型完全不知道外部細節。如果您的域對象需要用戶標識來強制執行業務規則,我會使用您當前的方法並將用戶作爲參數發送。如果您只需要用戶ID進行跟蹤/審計,則可以豐富活動。