我有一個場景,其中給定的實體可能被標記爲軟刪除或基於某些邏輯的硬刪除,當用戶請求刪除。 0123d
從DDD範式來解決這個問題,我看到一些問題: - DDD建議使用Repository對象來處理所有與持久相關的東西,其中域層只是定義了這樣的repo接口(包含典型的方法,如store,remove,find)和包含實際實施的基礎設施層。鑑於此,那麼對於我這裏的問題,決定是否進行軟刪除的邏輯屬於域層,那麼如何在域層中包含邏輯,使得任何其他刪除請求的安全性成爲可能在實際調用RepoImpl上的一個刪除操作來實際從底層存儲庫中刪除該實體之前,層是通過該邏輯引導的。
即使我有像void removeEntity(Entity ent)
的方法的域名服務,事實上,我已經有我叫void remove(Entity ent)
失敗的目的回購界面上的公共方法,因爲我不能強制執行服務層的removeEntity
是總是被調用,而不是remove
回購和RepoImpl需要有一個刪除方法來實施刪除實體。
建議的解決方案
==============
我有這個想法,看起來相當做作,假設回購接口有有提供最終的抽象實現public void remove(Entity ent)
,抽象的實現可以通過這個邏輯來判斷它是軟還是硬刪除。如果它的軟刪除其實際上設置適當的標記實體的更新,所以它調用this.store(ent)
否則它包裝的實體在DeleteEvent
類在DDD中的軟刪除
public class DeleteEvent<T>{
//parametrized for Entity
private T ent;
DeleteEvent(T ent){
this.entity = ent;
}
public T getEntity(){
return this.entity;
}
}
注意本次非公開,包訪問構造,物體此類只能在領域層內部構建,因此RepoImpl上的其他移除方法是void removeFromStore(DeleteEvent evt)
RepoImpl從此縮放器/持有者獲取實體並實現移除過程。
這雖然看起來像可以工作是比較古怪/ hacky,有沒有更清晰的方式來實現相同?
DDD認識到刪除的概念不是嗎?所以當Repository接口有一個名爲'void remove(Entity ent)'的方法時,實現者應該怎麼做?因爲你提到它,如何將用戶CRUD操作映射到域操作?所以顯然用戶知道的刪除不是在這裏刪除(在某些情況下)。在這種情況下,無處不在的語言不會擴展到用戶,是嗎? – redzedi 2012-07-25 10:46:51
我會說刪除方法應該設置Deleted = true或類似的東西。 – Pein 2012-07-25 11:19:54
如果您的用戶只執行CRUD操作,您是否真的需要DDD或者只是過度工程? – Pein 2012-07-25 11:21:38