2011-07-21 81 views
5

我已經創建了一個使用實體框架從我的數據庫返回數據的存儲庫,我需要將這些數據提供給我的視圖,但在此之前我需要將這些對象轉換爲我的視圖領域模型。MVC倉庫 - 域模型vs實體模型

我的模式是這樣的:

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 

我產生從而結束了尋找這樣一個實體模型:

Project 
| 
---->ProjectResources 
    | 
    ---->Resource 

我有一個返回項目資源庫:

public interface IProjectRepository 
{ 
    Project GetProject(int id); 
} 

和控制器動作:

public ActionResult Edit(int id) 
{ 
    Project project = projectRepository.GetProject(id); 

    return View(project); 
} 

當我嘗試並POST這些數據時,這似乎不起作用。當它試圖重建ProjectResources集合時,我得到了一個EntityCollection已經初始化的錯誤。

我認爲這是聰明創建一個域模型就是有點簡單:

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 - >資源跳躍。 ProjectResource會有我需要的字段。而不是做類似的:

@foreach(var resource in Model.ProjectResources) { 
    @Html.DisplayFor(m => m.Resource.FirstName) 
} 

我可以這樣做:

@foreach(var resoure in Model.Resources) { 
    @Html.DisplayFor(m => resource.FirstName); 
} 

我的問題是如下 我應該從我的倉庫返回我的域模型還是應該由控制器來處理或中間的其他班級?如果它是通過將項目映射到ProjectEdit的東西在控制器中處理的,那會是什麼樣子?

回答

5

我自己的看法是,你不應該返回任何東西到你的控制器或依賴於你的倉庫實現的視圖。

如果您將EF與POCO Generator一起使用,那麼將這些類用於您的域模型是合理的,因爲它們獨立於EF實現(您可以替換EF並保留POCO)。

但是,如果您使用EF與其EntityObjects,我相信你應該轉換到您的域模型。如果您的數據訪問被封裝在內部使用存儲庫模式的WCF服務中,我不會過多擔心從存儲庫中返回EntityObjects。但是如果您直接從MVC使用存儲庫,請使用域模型作爲存儲庫的接口。

+0

所以你說我的倉庫應該返回域模型而不是實體模型? – Dismissile

+0

如果您的存儲庫未封裝在單獨的服務中,是的。請下來選民請解釋一下 –

-1

你所描述的正是我多年來一直在做的事,追隨着n層應用程序設計。

因爲您的數據並不總是以與您的域相同的方式組織。在SQL中發生的事情在您的域中並不總是一樣的,正如您在這裏遇到的一樣。

通常,我的域名知道存儲庫的外觀,並具有用於轉換的方法。我的用戶界面/視圖知道該域的外觀,並有檢索該數據(在控制器中)的方法。

這麼簡單的答案,我會說,在中間的東西(你的業務層),並讓你的控制器可以使用這些方法來接收這些數據。

+0

。 – Jay

3

我們往往總是使用一個ViewModel作爲「中間階級」,並映射到和使用實際模型...

Automapper

......或者......

ValueInjecter

如果你願意,你的ViewModel可以在結構上相當獨立於你的模型。