將數據庫實體映射到模型並執行業務邏輯的最佳實踐是什麼?我已經看到了兩個不同的實現。我注意到了一些實現,其中Repository(在數據層中)本身負責將數據庫實體映射到域模型。例如,一個存儲庫這樣做:將實體映射到模型並在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 N個雙層設計,我注意到,雖然沒有銀彈,在大多數情況下,這是最好的內部執行映射MVC項目中的控制器手動或使用Mapper。還有人重申,服務層不應該執行映射,並且應該負責執行業務邏輯。這裏有幾個問題:
- 哪種方法對於將實體映射到模型以及反之亦然是可取的?存儲庫應該這樣做還是應該在控制器中完成映射?
- 假設我想對從數據庫中檢索到的實體執行一些業務邏輯,例如返回
Person
實體的全名,或者將所有Person
的年齡增加10年,應該在何處操作被執行。在模型本身?例如,我會在模型上有一個FullName
屬性來計算全名和年齡?還是我在我的服務層中定義一些服務來執行業務邏輯?
編輯
哇這麼多的接近票數。道歉,我沒有足夠全面的搜索。我在這裏提出的「在何處執行業務邏輯」的問題已經可以在SO和其他地方發現的(雖然有時有點傳達含糊):
Validating with a Service Layer by Stephen Walther
Another great, but more generic answer here on SO
Where Should I put My Controller Business Logic in MVC
Does a Service Map Entities to a View Model
但是我還沒有找到標準的解決方案來解決映射問題,而且我想我可能更加雄辯地表達了我的問題。因此,普遍的共識似乎是業務邏輯進入服務層,並且將域模型映射到視圖模型應該發生在控制器/表示層中。由於不建議將數據庫實體映射到數據層以外的任何層,因此建議您將實體映射到數據層的域模型,可以手動或通過映射器(如Auto Mapper)進行映射(這是我從中收集的閱讀很多文章)。我的疑惑出現在將實體映射到域模型和映射域模型以查看模型的位置的問題。不過,正如我之前提到的,我可以更清楚地表達我的問題。造成混淆的原因是我已經閱讀過映射實體到域模型應該發生在控制器中,這應該改爲說:「將實體映射到域模型應該在稍後發生在數據上,並且映射域模型以查看模型應該發生在控制器中