[英]MVC Repository - Domain Model vs Entity Model
我創建了一個使用 Entity Framework 從我的數據庫返回數據的存儲庫,我需要將此數據提供給我的視圖,但在此之前,我需要將這些對象轉換為我的域 model。
我的架構如下所示:
TABLE Project
Id INT PRIMARY KEY
Name NVARCHAR(100)
TABLE Resource
Id INT PRIMARY KEY
FirstName NVARCHAR(100)
LastName NVARCHAR(100)
TABLE ProjectResources
Project_Id INT PRIMARY KEY -- links to the Project table
Resource_Id INT PRIMARY KEY -- links to the Resource table
我生成了一個實體 model 最終看起來像這樣:
Project
|
---->ProjectResources
|
---->Resource
我有一個返回項目的存儲庫:
public interface IProjectRepository
{
Project GetProject(int id);
}
還有一個 controller 動作:
public ActionResult Edit(int id)
{
Project project = projectRepository.GetProject(id);
return View(project);
}
當我嘗試發布這些數據時,這似乎效果不佳。 我在嘗試重建 ProjectResources 集合時收到 EntityCollection 已初始化錯誤。
我認為創建一個更簡單一點的域 model 更聰明:
public class ProjectEdit
{
public string ProjectName { get; set; }
public List<ProjectResource> Resources { get; set; }
}
public class ProjectResource
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
這似乎更好一點,因為我也沒有中間 ProjectResources -> Resource jump。 ProjectResource 將具有我需要的字段。 而不是做類似的事情:
@foreach( var resource in Model.ProjectResources ) {
@Html.DisplayFor(m => m.Resource.FirstName)
}
我可以:
@foreach( var resoure in Model.Resources ) {
@Html.DisplayFor(m => resource.FirstName);
}
我的問題如下我應該從我的存儲庫中返回我的域 model 還是應該由 controller 或中間的其他一些 class 處理? 如果它在 controller 中通過將我的項目映射到 ProjectEdit 的東西來處理,那會是什么樣子?
我自己的觀點是,您不應該向 controller 或依賴於存儲庫實現的視圖返回任何內容。
如果您將 EF 與 POCO 生成器一起使用,則將這些類用於您的域 model 是合理的,因為它們獨立於 EF 實現(您可以替換 EF 並保留 POCO)。
但是,如果您使用 EF 及其 EntityObjects,我相信您應該轉換為您的域 model。 如果您的數據訪問被封裝在內部使用存儲庫模式的 WCF 服務中,我不會太擔心從存儲庫返回 EntityObjects。 但是,如果您直接從 MVC 使用存儲庫,請使用域 Model 作為存儲庫的接口。
您所描述的正是我多年來一直在做的事情,緊跟 n 層應用程序設計。
因為您的數據並不總是以與您的域相同的方式組織。 從 SQL 開始的原因在您的域中並不總是相同,正如您在這里遇到的那樣。
通常,我的域知道存儲庫的外觀,並具有相互轉換的方法。 我的 UI/視圖知道域的外觀,並具有檢索該數據的方法(進入控制器)。
所以簡短的回答,我會說,中間的東西(你的業務層),並讓你的控制器可以使用公開的方法來接收該數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.