Asp.net-Mvc
如何使用 EF 建構 ASP.Net MVC 應用程序?
我在概念化如何將帶有實體框架的 MVC 應用程序建構為 n 層應用程序時遇到了一些麻煩。
普通的、教科書式的 3 層應用程序應該看起來像
數據訪問->業務邏輯->表示
展示文稿不應該對數據訪問一無所知。使用 EF,所有層都需要了解模型。所以我的架構現在看起來更像
Data Access->Business Logic | | --------------- | MVC我在這裡遺漏了什麼還是我以錯誤的方式思考這個問題?
我是否應該將 EF 本身視為數據訪問層並將實體放入業務邏輯中?
好吧,我想你的問題是,如何在 MVC 應用程序中建構“層”。看一下這個簡單的架構,我將它用於我的 MVC 應用程序,它似乎乾淨高效。
- 解決方案中的項目 - 業務模型 - 充滿代表業務領域的 POCO 類的簡單類庫。您可以在此處使用數據註釋、用於驗證邏輯的元數據類等。
- project - 基於 EF 的儲存庫 - 另一個簡單的類庫;這裡是定義的上下文(EF 程式碼優先很好,但您可以先使用 EF 數據庫或先使用模型 - 您只需將 POCO T4 模板添加到業務模型類庫,沒什麼大不了的)和類集 - 儲存庫
- 項目 - 我通常稱它為“ServiceLayer”左右(我願意建議更好的名稱:) - 它僅包含介面,用於儲存庫和其他服務(在單獨的項目中實現),這些服務將基於我的 MVC(或任何其他技術)應用程序使用;2.project 中的儲存庫實現了這些介面
- 項目 - 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)