2012-11-14 24 views
3

我正在研究涉及版本控制實體的項目,以便用戶修改整個歷史記錄。根據服務有一個存儲庫可以嗎?

基本上,這個想法是當一個實體被創建時,其內容的版本1也被保存在一個存檔表中。無論何時修改實體,都會存儲增量版本。

將實體的狀態保存到歸檔表由ArchiveService處理。

當實體被持久化時,ArchiveService需要被調用,以創建第1版,所以最合理的方式似乎是從存儲庫調用它,從而通過服務作爲一個依賴到倉庫:

public class Repository { 
    private ArchiveService archiveService; 

    public Repository(ArchiveService service) { 
     this.archiveService = service; 
    } 

    public void add(Entity entity) { 
     // ... (persist the entity) 

     this.archiveService.createVersion(entity); 
    } 
} 

這是一個很好的做法,還是有任何缺點? 到目前爲止,我所看到的服務取決於存儲庫,而不是其他方式。

回答

3

如果按照描述對其進行建模,您可以隱式地將領域知識隱藏在存儲庫中,而存儲庫本身不屬於域的一部分。我不認爲這會是一個好主意。

您可以使用Domain Events對其進行建模,即EntityCreated。事件監聽器可以選擇事件並創建相應的歸檔條目。

更新回答這個自小在評論一個問題:

從概念上講,庫封裝在數據存儲持久 對象的集合,並在他們所執行的操作,提供了 持久層的更多面向對象的視圖。 - Martin Fowler

除了正式的定義:一個倉庫知道如何存儲和檢索的對象。爲了能夠實現這一點,它需要知道持久化機制或者至少在下面的數據訪問層。

另一方面,領域模型不應該依賴於外部的任何東西。在體系結構(它比傳統分層方法更適合於DDD)中,存儲庫將是適配器之一。

您的域只知道其存儲庫的接口,實際的實現是在外面。這樣你只有內向的依賴關係。基本上這是面向對象的,而具有向下指向級聯依賴關係的分層架構更多的是一種程序方法。

+0

我一直認爲存儲庫是域的一部分。你有這樣的來源嗎? – Benjamin

+0

@Benjamin我在最新的答案中詳細闡述了這一點。 –

+0

謝謝,這有助於很多。 – Benjamin

2

正在歸檔屬於您無處不在的語言的域概念嗎?如果是,則應在域圖層中定義ArchiveService。否則,它可以在基礎架構層中定義,並且IRepository的每個實現將選擇是否存檔。

在任何情況下,根據ArchiveService(或任何其他服務),我沒有發現存儲庫有任何問題。您可以立即撥打repository.add(entity)撥打archiveService.createVersion(entity)的所有代碼,但這不會很方便。

+0

是的,它是無處不在的語言和領域模型的一部分,我們希望能夠搜索和顯示檔案,查看誰做了什麼,等等。 – Benjamin

相關問題