Asp.net-Mvc
在 ASP.NET MVC 中將實體映射到模型並執行業務邏輯
將數據庫實體映射到模型和執行業務邏輯的最佳實踐是什麼?我已經看到了兩者的相當不同的實現。我注意到許多實現,其中儲存庫(在數據層中)本身負責將數據庫實體映射到域模型。例如,可以執行此操作的儲存庫:
public IQueryable<Person> GetPersons() { return DbSet.Select(s => new Person { Id = s.Id, FirstName= s.FirstName, Surname= s.Surname, Location = s.Location, }); }但是在全面搜尋了 SO on N Tier 設計之後,我注意到雖然沒有靈丹妙藥,但在大多數情況下,建議手動或使用 Mapper 在 MVC 項目中的控制器內部執行映射。還重申了服務層永遠不應該執行映射,它的職責應該是執行業務邏輯。這裡有幾個問題:
- 關於將實體映射到模型的位置以及反之亦然,哪種方法是可取的?儲存庫應該這樣做還是應該在控制器中完成映射?
- 假設我想對我從數據庫中檢索到的實體執行一些業務邏輯,例如返回實體的全名
Person,或者將所有s的年齡增加Person10年,這個操作應該在哪裡執行。在模型本身?例如,我會FullName在模型上有一個屬性來計算全名和年齡嗎?或者我是否在我的服務層中定義了一些服務來執行業務邏輯?編輯
哇這麼多接近的票。抱歉,我搜尋的不夠全面。我在這裡提出的“在哪裡執行業務邏輯”問題已經可以在 SO 和其他地方找到(儘管有時傳達得有些神秘):
但是,我還沒有找到解決我所遇到的映射問題的標準解決方案,我想我也許可以更雄辯地表達我的問題。所以普遍的共識似乎是業務邏輯進入服務層,將領域模型映射到視圖模型應該發生在控制器/表示層。並且由於建議不要將您的數據庫實體顯示到數據層以外的任何層,因此建議您手動或通過諸如 Auto Mapper 之類的映射器將您的實體映射到數據層的域模型(這是我從閱讀許多文章)。我的困惑源於應該將實體映射到域模型以及將域模型映射到視圖模型的問題。然而,正如我之前提到的那樣,我本可以更清楚地表達我的問題。
- 關於將實體映射到模型的位置以及反之亦然,哪種方法是可取的?儲存庫應該這樣做還是應該在控制器中完成映射?
我強烈希望看到映射發生在儲存庫而不是控制器中。正如 Suhas 在他的回答中提到的那樣,控制器需要純粹充當協調員。作為替代方案,也許您可以利用儲存庫中的映射類來傳遞實體並返回映射模型 - 有點像Auto Mapper
- 假設我想對從數據庫中檢索到的實體執行一些業務邏輯,例如,返回 Person 實體的全名,或者將所有 Person 的年齡增加 10 年,應該在哪裡執行此操作。在模型本身?例如,我會在模型上有一個 FullName 屬性來計算全名和年齡嗎?或者我是否在我的服務層中定義了一些服務來執行業務邏輯?
如果可能,請在服務上執行業務邏輯。為什麼要讓應用程序承擔服務層應該做的事情?我相信這是服務的域,而不是應用程序的域。另外,我也不認為從模型返回連接或派生的屬性是一件壞事。
概括:
- 控制器處理來自視圖的請求並將它們轉發到儲存庫
- 儲存庫是您的數據儲存的管道
- 服務處理來自儲存庫的請求,處理業務邏輯,並返回映射模型