與this question稍有關係:我是否應該將存儲庫傳遞給需要在方法操作發生並保持後才觸發事件的域對象方法?我應該將資源庫傳遞給域方法引發事件的方法
在這種情況下,系統需要在域對象狀態更改後發送電子郵件。雖然不太可能,但可能發生的情況是,在不發送電子郵件的情況下,狀態更改不會持續。
我可以用一個域名服務做的工作,但狀態變化的所有邏輯所屬包含在域對象,所以我的服務最終會看起來像
StatusService(Irepo repo) {
void ChangeStatus(domainObject myObject, status newStatus) {
try {
myObject.ChangeStatus(newStatus);
repo.Save(myObject);
raiseEvent(new StausChangeEmailEvent(myObject))
} catch { .. dont send email }
}
哪個ID寧願不做由於幾個原因(其中之一是現在有2種方式更改狀態,其中只有一種發送電子郵件)
編號喜歡把它包裝在域方法本身,但這也不覺得正確,因爲我'使域對象負責自己的持久性。 (雖然我覺得我更喜歡在域名服務方式)
class DomainObject() : IAggRoot {
...
public ChangeStatus(irepo repo, status newStatus) {
..logic logic
this.Status = newStatus;
repo.Save(this);
raiseEvent(new StausChangeEmailEvent(myObject))
}
}
有一些關於業務邏輯的併發症,但我真的很感興趣如何觸發事件域對象被持久化之後。
編輯:如果電子郵件發送失敗並不重要,如果狀態不「發送」,組織中的高級人員可能會收到其郵箱中的無效指令,因此不發送電子郵件非常重要。
你關心發送郵件是否失敗嗎? – JefClaes
好問題 - 如果電子郵件部分失敗,沒有它那麼重要。 – Joe