簡體   English   中英

MVC 存儲庫 - 域 Model 與實體 Model

[英]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 作為存儲庫的接口。

我們傾向於總是使用 ViewModel 作為“中間的 class”和 map 來往於實際的 Model 使用...

自動映射器

...或者...

價值注入器

如果你想要的話,你的 ViewModel 可以在結構上完全獨立於你的 Model。

您所描述的正是我多年來一直在做的事情,緊跟 n 層應用程序設計。

因為您的數據並不總是以與您的域相同的方式組織。 從 SQL 開始的原因在您的域中並不總是相同,正如您在這里遇到的那樣。

通常,我的域知道存儲庫的外觀,並具有相互轉換的方法。 我的 UI/視圖知道域的外觀,並具有檢索該數據的方法(進入控制器)。

所以簡短的回答,我會說,中間的東西(你的業務層),並讓你的控制器可以使用公開的方法來接收該數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM