2012-07-25 47 views
0

我有一個場景,其中給定的實體可能被標記爲軟刪除或基於某些邏輯的硬刪除,當用戶請求刪除。 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,有沒有更清晰的方式來實現相同?

回答

2

你的主要問題是這裏缺乏無處不在的語言。軟刪除和硬刪除不是域名術語,而是技術性術語。你需要做的第一件事是圍繞技術性刪除行爲重新考慮你的用例語言。刪除是什麼意思?我會說你需要一個取消,撤銷,過期,暫停,禁止,阻止,完成等。想想狀態你把你的域模型,而不是CRUD行動。

那麼你的問題的答案是:永遠不要硬刪除。

更多閱讀:http://www.udidahan.com/2009/09/01/dont-delete-just-dont/

+0

DDD認識到刪除的概念不是嗎?所以當Repository接口有一個名爲'void remove(Entity ent)'的方法時,實現者應該怎麼做?因爲你提到它,如何將用戶CRUD操作映射到域操作?所以顯然用戶知道的刪除不是在這裏刪除(在某些情況下)。在這種情況下,無處不在的語言不會擴展到用戶,是嗎? – redzedi 2012-07-25 10:46:51

+0

我會說刪除方法應該設置Deleted = true或類似的東西。 – Pein 2012-07-25 11:19:54

+1

如果您的用戶只執行CRUD操作,您是否真的需要DDD或者只是過度工程? – Pein 2012-07-25 11:21:38