2011-02-24 32 views
1

我對DDD & Spring有個疑問。我總是圍繞貧血域模型和服務來設計我的應用程序,關注業務邏輯/持久性。使用Spring進行域驅動編程

假設您有一個Domain對象的spring管理持久性/存儲庫服務,例如書。如果我必須在書上公開save()方法,那麼我需要在我的域中存儲庫bean,否則我將不得不查找存儲庫bean的上下文。這與依賴注入完全相反。

現在,如果我有存儲庫ID注入域和域對象被緩存(集羣緩存),然後反序列化它將不會有注入的存儲庫服務,因爲彈簧容器將不同。

我可能是錯的,但如果有人能解釋一下我這種情況會是如何工作的,這將是很大的幫助

+0

存儲庫是傳統領域的一部分,正確嗎?至少,如果我們將「域驅動設計」這本書中的指示視爲傳統。 – 2011-02-24 23:06:57

+0

即使那時庫是由Spring管理的我們如何在不違反DI概念的情況下注入這些存儲庫 – Jany 2011-02-25 05:18:55

回答

1

我認爲一個「保存」方法(保存在一個數據庫,例如)不屬於域對象......這本書是否「保存」自己?或者是存儲庫保存它?...

+0

+1 save/update/delete ...操作不屬於域對象本身。 – fmucar 2011-02-25 13:15:03

+0

保存方法屬於域對象,它是存儲庫保存的委託。如果將存儲移動到存儲庫服務,則業務/服務層將調用存儲庫以保存轉向服務分層體系結構的域。我想我必須開始閱讀DDD才能清楚地理解我的概念 – Jany 2011-02-25 14:55:46

2

我認爲應用程序的「外觀」應該使用存儲庫(或其他基礎結構服務)來保存「書」。本書不應該保存它自己,這是版本庫的責任。

如果您需要從域實體進行任何基礎架構操作(例如搜索數據庫),那麼您應該通過查看上下文(並結合Spring)或注入來訪問此存儲庫通過實體中的依賴注入來存儲庫。

問題是,實體的「實例化」不是Spring的責任,而是持久性提供者的責任,所以Spring無法處理這種注入。該怎麼辦?

嗯,有幾種方式(沒有人很「beautyful」)來做到這一點:

  • 通過AOP:您可以儀器面向方面框架(如AspectJ的)配置系統的代碼注入在實例化時刻實體中的任何依賴。
  • 通過Hibernate攔截器:如果您的持久性提供程序是Hibernate,它將爲您提供一個掛鉤,以便在實體的生命週期的某些點放置攔截器。你可以配置一個攔截器來查找spring context來在每個實體的實例化中注入依賴關係。
  • 也許最簡單的方法是實現一個小的和靜態的「serviceLocator」,再加上Spring查詢實體在他們需要時詢問的服務。這個服務定位器只是一個避免你的實體與Spring耦合的層。
相關問題