Asp.net-Mvc

如何使用 EF 建構 ASP.Net MVC 應用程序?

  • October 19, 2011

我在概念化如何將帶有實體框架的 MVC 應用程序建構為 n 層應用程序時遇到了一些麻煩。

普通的、教科書式的 3 層應用程序應該看起來像

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

展示文稿不應該對數據訪問一無所知。使用 EF,所有層都需要了解模型。所以我的架構現在看起來更像

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

我在這裡遺漏了什麼還是我以錯誤的方式思考這個問題?

我是否應該將 EF 本身視為數據訪問層並將實體放入業務邏輯中?

好吧,我想你的問題是,如何在 MVC 應用程序中建構“層”。看一下這個簡單的架構,我將它用於我的 MVC 應用程序,它似乎乾淨高效。

  1. 解決方案中的項目 - 業務模型 - 充滿代表業務領域的 POCO 類的簡單類庫。您可以在此處使用數據註釋、用於驗證邏輯的元數據類等。
  2. project - 基於 EF 的儲存庫 - 另一個簡單的類庫;這裡是定義的上下文(EF 程式碼優先很好,但您可以先使用 EF 數據庫或先使用模型 - 您只需將 POCO T4 模板添加到業務模型類庫,沒什麼大不了的)和類集 - 儲存庫
  3. 項目 - 我通常稱它為“ServiceLayer”左右(我願意建議更好的名稱:) - 它僅包含介面,用於儲存庫和其他服務(在單獨的項目中實現),這些服務將基於我的 MVC(或任何其他技術)應用程序使用;2.project 中的儲存庫實現了這些介面
  4. 項目 - MVC 網站。它使用依賴注入(在 DependencyResolver 中建構,我喜歡使用 Ninject 容器)來映射儲存庫(和其他服務);然後你可以使用建構子注入控制器,或者一些“懶惰”的方法(見下文)

它看起來像這樣:

瘦控制器:

公共類SomethingController:BaseController
{
公共 ActionResult DoSomething(SomeBusinessThing 輸入)
{
如果(模型狀態。IsValid)
{
var 結果 = CustomerRepository.DoSomeBusinessLogicAndPersistenceAndStuff(input);
返回視圖(結果);// 如果你不想使用業務對像作為視圖模型,你可以在這裡使用 AutoMapper
}
}
}

我的儲存庫“屬性”是從我的 BaseController 繼承的:

公共類 BaseController : 控制器
{
// ...所有(或多個)控制器使用的其他東西

私人 ICustomerRepository _customerRepository;
受保護的 ICustomerRepository CustomerRepository
{
得到
{
如果(_customerRepository== null)
_customerRepository= DependencyResolver.Current.GetService();
返回_customerRepository;
}
}
}

如果你的控制器使用許多服務,你可以使用這個“惰性”DI,但每個操作只有 1-2 個,所以用建構子注入所有這些服務效率低下。有人可能會告訴您以這種方式“隱藏”依賴關係,但如果您將所有這些東西放在一個地方 - BaseController,那沒什麼大不了的。

好吧,儲存庫的實施確實是您的事。MVC 應用程序甚至不知道您正在使用 EF,它只知道服務介面並且不關心底層實現(如果需要,您可以隨時切換!)

結論:

  • 控制器很瘦——沒有業務邏輯
  • 模型是 FAT - 在這種情況下,儲存庫封裝了所有業務邏輯(您當然也可以使用其他類型的服務,例如一些用於處理的計算器等,請記住,MVC 不在乎,只知道介面)
  • ViewModels 是 Views 的輸入(ViewModel 可以直接作為您的業務模型,或者您可以使用 AutoMapper 來創建“純”ViewModels)

引用自:https://stackoverflow.com/questions/7816279