2017-02-15 18 views
0

我想遵循以下模式中的DDD。DDD - 業務決策是基於數據庫邏輯

Controller-----DataContract----> Domain Layer (DDD) 

Controller-----Domain Object---> Repository---Entity--->EntityFramework 

正如您上面的圖中看到,領域層是獨立做出商業決策,但對我來說,大部分的商業決策採取的飛行。例如,

if(Account Number Associated?) 
    Load CustomerDetails //A database call is needed 
    .... 
    ..... 
    if(Has customer another loan) 
      ..... 
      ..... 
      Load other loan details //A database call is needed 
      ..... 
      ..... 
      if(Was that repaid?) 
       .... 
       .... 
       Load collateral details //A database call is needed 
       ..... 
       ..... 
       Calculate collateral details and return. 
      else 
       Load other data //A database call is needed 
     else 
      Load other data //A database call is needed 

else 
    Load other data //A database call is needed 

正如您看到上述示例,應用程序正在通過進行數據庫調用進行大量業務決策。由於域層應該不取決於存儲庫層,我不知道如何繼續。

我可以使用應用服務的數據庫調用,但隨後領域層不會有任何的邏輯在裏面。所有的邏輯將進入應用服務

請幫我這個。

-Pandian

回答

3

至少有三種可能的方式進行

1)設計你的資料庫一次加載整個集合。這種方法爲域模型提供了它可能需要的所有狀態,而不是試圖按需加載狀態。

2)運行應用服務中的查詢,並將數據傳遞給域模型。理想情況下,您可以提前做到這一點(這樣您就可以對域模型進行單一調用),但是如果這沒有意義,那麼域模型會告訴應用程序服務需要哪些數據,並且應用程序服務會發現數據並返回它。

3)將存儲庫傳遞到域模型中,使其能夠讀取它需要的數據。這本質上是「域服務」模式,但用於訪問數據存儲。

在此設計中,域模型正在定義存儲庫接口,並且應用程序提供了實現。換句話說,我們使用服務提供者模式來保持依賴性箭頭指向正確的方向。

+0

嗨@VoiceOfUnreason,感謝您的幫助。前兩種方法在我的情況下是不可能的。您能否指點我一些github/code這種「域名服務」的例子?另外,當你說「應用程序提供了實現」意味着「**應用程序服務**提供了實現」對吧? – Pandiarajan

1

@Pandiarajan域圖層可以包含域模型(實體,值對象),域服務和域事件。

從上面的代碼中,您可以創建一個域服務,將所有這些域邏輯和概念封裝爲非自然建模爲值對象或實體的域邏輯和概念。這些域服務可以使用處理所有數據庫調用的存儲庫。

還要注意,如果您需要返回的數據僅用於只讀或報告目的,您可能希望查找CQRS作爲替代選項。在CQRS中,所有這些讀取查詢都可以在呈現數據時繞過您的域圖層。 CQRS將消除將數據轉換爲域模型的需求。

+0

你能幫我指點一些示例項目在github或其他地方嗎? – Pandiarajan