2011-10-19 53 views
9

我在構思如何將實體框架MVC應用程序構建爲一個n層應用程序時遇到了一些問題。如何構建與EF的ASP.Net MVC應用程序?

正常,教材3層的應用程序應該是這個樣子

數據訪問 - >業務邏輯 - >演示

的表現不應該知道的數據訪問任何東西。藉助EF,所有圖層都需要了解模型。所以,我現在的建築看起來更像

Data Access->Business Logic 
    |    | 
     --------------- 
      | 
      MVC 

我失去了一些東西在這裏還是我在錯誤的方式思考這個?

我應該是EF本身的思想爲數據訪問層,把實體的商業邏輯?

+0

這是一篇關於.NET應用程序體系結構的好書,並且有關於MVC的一節:http://www.amazon.com/Microsoft%C2%AE-NET-Architecting-Applications-Pro-Developer/dp/073562609X –

回答

9

好吧,我想你的問題是,如何構建「層」在MVC應用程序。 看看這個簡單的架構,我將它用於我的MVC應用程序,它看起來乾淨而高效。

  1. 項目解決方案 - 商業模式 - 簡單的類庫充滿了代表業務領域的POCO類。您可以使用此數據註解,元數據類的驗證邏輯等

  2. 項目 - 基於EF-庫 - 另一個簡單的類庫;這裏定義的上下文(EF代碼首先是偉大的,但你可以先使用EF數據庫第一或模型 - 你只需要POCO T4模板添加到商業模式的類庫,沒什麼大不了的)和一組類 - 庫

  3. 項目 - 我通常稱之爲「ServiceLayer」左右(我打開的建議更好的名字:) - 它僅包含接口,倉庫和其他服務(在不同的項目中實現),將我的MVC(或任何其他技術)基於應用程序使用;從二,項目庫實現這些接口

  4. 項目 - MVC的網站。它使用依賴注入(構建在DependencyResolver中,我喜歡使用Ninject容器)來映射存儲庫(和其他服務);然後你可以使用構造器注入到控制器,或者一些「懶」的方法(見下文)

它看起來是這樣的:

瘦控制器:

 
public class SomethingController : BaseController 
{ 
    public ActionResult DoSomething(SomeBusinessThing input) 
    { 
     if (ModelState.IsValid) 
     { 
      var result = CustomerRepository.DoSomeBusinessLogicAndPersistenceAndStuff(input); 
      return View(result); // you can use AutoMapper here, if you dont want to use business object as viewmodels 
     } 
    } 
} 

我的倉庫「屬性「是繼承自我的BaseController:

 
public class BaseController : Controller 
{ 
    // ... other stuff used by all (or multiple) controllers 

    private ICustomerRepository _customerRepository; 
     protected ICustomerRepository CustomerRepository 
     { 
      get 
      { 
       if (_customerRepository== null) 
        _customerRepository= DependencyResolver.Current.GetService(); 
       return _customerRepository; 
      } 
     } 
} 

如果您使用了」懶惰「控制器使用許多服務,但每個動作只有1-2個,因此將它們全部用構造函數注入將會是低效的。有人可以告訴你這樣「隱藏」依賴關係,但是如果你把所有這些東西放在一個地方 - BaseController,它沒什麼大不了的。

那麼,存儲庫的實施真的是你的業務。 MVC應用程序甚至不知道使用的是EF,它知道服務的唯一接口和犯規約墊層實施護理

Conslusion(你可以切換後,如果你需要的任何時間!):

  • 控制器是瘦的 - 沒有業務邏輯

  • 型號爲FAT - 在這種情況下,庫封裝所有的業務邏輯(可以肯定的是使用其他類型的服務爲好,例如一些計算器處理等,還記得,MVC不在乎,知道onl Ÿ接口)

  • 的ViewModels是意見輸入(和視圖模型可以是你的商業模式直接,或者您可以使用AutoMapper創建「純粹」的ViewModels)

+0

你有沒有基於上述架構師的示例項目? –

+0

非常通知答案。順便說一句,我相信第三層被稱爲「應用層」。 –

+0

@rouen在'SomethingController'中,而不是在Repository類('CustomerRepository.DoSomeBusinessLogicAndPersistenceAndStuff')*中執行業務邏輯,它給出了存儲庫類** 2的職責** *如果會有'BusinessLogic'會更好。所以模式看起來像這個'controller' - >'businessLogic' - >'data'。 – tchelidze

5

您可以將您的EF實體視爲數據對象,並將視圖模型分別傳遞給視圖中的。來自EF對象的數據可用於填充視圖模型(類似於AutoMapper這樣的庫在此處很有用)。這樣,您的視圖永遠不會對EF對象產生直接依賴關係,而只會影響您的視圖模型。

+0

我假設視圖模型不是MVC中的MV,對吧?視圖模型與EF有關? – Scottie

+0

視圖模型是獨立於數據訪問庫的標準類。這是一個愚蠢的對象,包含視圖將使用的數據。 –

+0

@Scottie - EF中的數據對象是EF特有的(如果你想保持乾淨的代碼分離),所以不要在你的數據層之外使用它們。 –

0

我可以推薦你真的很好(我思考)關於.NET平臺上的域驅動的體系結構設計的書。 Book si稱.NET 4.0爲N層域驅動架構guid。本書解釋瞭如何使用EF和MVC(以及許多其他的東西,如Silverlight,IoC和Unity等)創建良好的體系結構。

讀者可在以下網址下載:

http://msdn.microsoft.com/es-es/architecture/en/

而且樣本應用程序是很有意思:

http://microsoftnlayerapp.codeplex.com/

最好的方法如何被創造的POCO類獨立創造EF實體在持久層上。這些域實體包含在域(業務)邏輯層中。本書還解釋了應用程序應該分爲更多層,它們分別解釋了Presentation,Appliaction,Domain,Infrastructure(主要是數據持久性),Cross-cutting和Distributed services層。

相關問題