2011-11-03 88 views
2

我的任務是將應用程序從SharePoint轉換爲.NET。我很關心正確的做法,所以我找了一本體系結構書來閱讀模式和實踐。服務,模型和存儲庫層之間的交互

我試圖使用域驅動設計對所有東西進行建模。我有一個代表我的世界的模型,一個將它存儲在數據庫中的Repository,以及一個與UI交互的服務層(這是WebForms,因爲我在MVC中沒有0經驗,並且已經很難用這個工作來跋涉)。

我很難理解圖層互動的正確方法。我的理解是,模型應該是一切的基礎。它什麼都沒有引用,其他圖層引用它。
問題1:對嗎?

我真的很關心服務層。我注意到我正在開發一個非常貧血的模型,原因有兩個:1,我的模型沒有引用Repository,所以我不能通過模型​​存儲任何東西。 2,我試圖在事情發生的時候做事(例如,我將一個對象添加到一個對象列表中,所以當用戶完成添加對象時,我一次一個地將它存儲在數據庫中,而不是一次)。所以很多工作都在Service和Rep層之間完成,Model只是在那裏,看起來不錯。

我開始擔心 - 我在開發的早期階段,但我被看作是所有這些設計師。我不想要維護噩夢(我預計這個應用將會使用多年)。與往常一樣,時間是一個問題,我無法有效地進行準備/學習。任何幫助將會膨脹。 :-)

回答

2

模型應該是一切的基礎。它什麼都沒有引用,其他圖層引用它。 問題1:對嗎?

強制域模型和持久性系統之間分離的典型方法是定義存儲庫。然而,持久性是而不是是域模型的一部分。

你的模型應由存儲庫中定義調用方法

例如,考慮這是完全假的倉庫:

// Repository 
public class SharepointRepository 
{ 
    void SaveWidget(); // Implement 
} 

這樣倉庫僅關注加載和保存數據,他們不根本不包含任何你的域邏輯。

但是,如果您的模型與存儲庫緊密綁定,則會出現問題分離問題。

所以在這種情況下,依賴注入變得有用。通過前面的示例,您的模型必須顯式實例化SharePointRepository並調用方法。更簡單的方法是讓模型不關心在運行時注入存儲庫的依賴關係。

namespace YourApp.Domain.Abstract 
{ 
    public interface ISharePointRepository 
    { 
     void SaveWidget(); 
    } 
} 

基於該接口的,你可以建立一個具體實施並注入的依賴在運行時的具體落實。

namespace YourApp.Domain.Concrete 
{ 
    public class SqlSharePointRepository : ISharePointRepository 
    { 
     void SaveWidget() 
     { 
      // Code that Saves the widget using the managed sql provider 
     } 

    } 
} 

所以,你的網站形式:

當你收集數據,你的模型將與表單數據進行水合,並且將調用庫方法,但是庫本身會被注入運行時的asp.net應用程序,因此您可以在不中斷應用程序的情況下將SqlSharePointRepository更改爲RavenDbRepository。

要了解如何將倉庫綁定在Web表單看到這個帖子SO:How can I implement Ninject or DI on asp.net Web Forms?

在MVC中的控制器負責你認爲你所遇到的差距。但對於您的問題和根據您當前的設計,模型應該調用存儲庫操作,但是存儲庫本身應該是鬆散耦合的。

+0

這非常有幫助。當你說模型沒有「引用」倉庫時,你是什麼意思?現在我有模型和代表在單獨的項目。如果模型調用Rep來堅持,Model需要引用Repository,對嗎? –

+0

是的,但它仍然會鬆散耦合,如果在運行時注入存儲庫,所以您仍然有問題的分離。 – kd7