2013-09-16 23 views
2

我正在使用ORM重新建模現有應用程序,並試圖儘可能遵守DDD。使用原則的DDD

工單是AR,有十幾個子實體。我打算建模這個類如下:

class WorkOrder { 

    private $number = 0; 
    private $manual = ''; 

    ... 

    // Sub-Entities 

    private $consumables; // Collection (1:m) 
    private $dimensions; // Collection (1:m) 
    private $sequences; // Collection (1:m) 

    ... 

} 

現在我需要一個存儲庫來加載(並堅持?)這個聚合根 - 正確嗎?

回購將返回一個或多個聚合,當我訪問子實體(通過間接的getter/setters - 不是點符號)將延遲加載我後的信息?

我將有另一個類作爲一個工廠,用於創建工單 - 這是一個具體工作過程,包括大量的業務邏輯/驗證規則...

但如果工廠創建工作訂單合計不回購剛剛堅持AR?

該工廠將不得不查詢第三方服務(通過REST或其他方式),並基本上構建一個描述工作範圍的批准文檔的快照。

因此,存儲庫封裝了ORM或我應該選擇的永久持久層?

現在我的文件結構看起來是這樣的:

WorkOrder/ 
    /Factory.php 
    /Aggregate.php 
    /Repository.php 

    /Entity/Header.php 
    /Entity/Shipping.php 
    /Entity/Warranty.php 
    /Entity/Certification.php 
    ... 

存儲庫將有這樣的方法:

FindOneByTrackingNumber() 
FindAllByCriteria() 

save($root); 

我廠將有類似的方法:

createWorkOrderFromRpi() 
createWorkOrderFromCsv() 
... 

我已閱讀了幾篇文章和無數帖子在這裏:

http://williamdurand.fr/2013/08/07/ddd-with-symfony2-folder-structure-and-code-first/

雖然細節是優秀的,我需要我自己的解釋第二個意見,謝謝。 :)

問候, 亞歷

+0

我在這裏繞過這一點的房子 - > http://stackoverflow.com/questions/13894200/making-a-fat-model-in-symfony-2-composition-or-inheritance-and-how- to-configur我們剛剛開始使用DDD重新實現我們的SF2應用程序,所以感謝上面的鏈接! – calumbrodie

回答

5

主義不適合DDD。它無法處理深層域對象關係。我認爲沒有ORM可以在不寫大量註釋或映射元數據的情況下很好地映射對象。如果您正確地構建您的域模型,ORM將毫無用處。

您需要考慮一個DDD的基本規則:每個聚合一個事務。考慮到該規則來設計您的域模型也會幫助您實現持久性。你甚至會意識到你不再需要關係數據庫了。即使通過使用RDBMS也能幫助您獲得可擴展性。

是的,99%的案例中的存儲庫用於保留域對象。存儲庫應該處理映射,而不是通過使用數據反射來自動填充域對象的ORM,域對象不應該關心的方法。

在刪除和保存聚合時,在存儲庫中創建自己的映射(簡單屬性數據庫表列映射)並不困難。問題是更新聚合,但問題不是映射,而是跟蹤域對象的狀態更改。但是,這不是一個製圖問題,而是一個工作單位的關注。

現在我需要一個存儲庫來加載(並堅持?)這個聚合根 - 正確嗎?
正確。存儲庫會持續進行域狀態更改,並重新構建域的狀態。

回購將返回一個或多個聚合,當我訪問子實體(通過間接的getter/setters - 不是點符號)將延遲加載信息我後?
是的,你可以有getter(如果你使用領域模型填充用戶界面,選擇使用領域模型的cqrs只是爲了跟蹤領域的狀態)。你不應該有setter,你應該只有改變狀態的方法,這些方法反映了無處不在的語言(changeName,addItemToCart)。延遲加載僅用於保存一些內存。如果內存不是問題,您還可以製作域對象最新狀態的快照。是的延遲加載是ORM的工作,它迫使你在你的域對象中有某種獲取者,這對DDD來說是一個很大的限制。

但是,如果工廠創建工單總量,回購只是堅持AR?
工廠在您的域中創建新狀態。倉庫重新建立了曾經由工廠創建的狀態。

因此,存儲庫封裝了ORM或我應該選擇的永久持久層?
是的存儲庫應該處理域狀態的重組。 ORM只是一個技術問題,它只是一個圖書館。無論如何,ORM是公共庫/共享內核層的一部分,存儲庫是基礎架構層的一部分。

關於您的文件結構,您應該瞭解有關DIP,IOC,DDD有界上下文的更多信息。這將幫助您構建基於組件的應用程序,並將組件分解爲可擴展的應用程序。

+0

這正是我對DDD和ORM的看法。我還沒有找到有人確認我的想法的答案。我有點擔心。但這個答案是現貨。謝謝。 – prograhammer

+0

我對沒有ORM的變更跟蹤更感興趣。甚至只是解決更新和刪除部分。你能分享一下你是如何做到的嗎? –