0

在asp.net MVC 4,我有2個DomainModels能否在 '視圖模型' 持有 '的DomainModel' type屬性

  1. 產品
  2. 訂購

和相關視圖模型

  1. OrderDetailsViewModel

在我的 「OrderDetailsViewModelMapper」 映射文件,我手動映射這些2個DomainModels到我的視圖模型。映射器文件「OrderDetailsViewModelMapper」將調用我的存儲庫方法,該方法將訪問數據庫並在映射到存儲庫本身後返回我的2個DomainModels,即Product和Order。所以mapper只是調用存儲庫並獲取它的DomainModels。我不想要Automapper。現在我對這個場景有兩個問題。

  1. 無論上述流程,以填補我的視圖模型違反任何的最佳做法?
  2. 我可以保留型產品&訂單的2個屬性在我的「OrderDetailsViewModel」像下面,只是單獨映射這些屬性只 而不是重複「OrderDetailsViewModel」 過裏面的所有屬性和地圖TEM?
public class OrderDetailsViewModelMapper 
{ 
public Product Product{ get; set; } 
public Order Order{ get; set; } 
} 
+0

我認爲這是嵌套類型的正確和最好的方法。我也一樣。有興趣看看有人會否認這一點。 – HaBo 2013-05-05 20:23:44

回答

0

我想你已經錯過了一些。

  • 首先映射器類是具有一些靜態方法 映射從一種類型到另對象靜態類。最好的方法是在界面中使用 Mapper,而不是在Repository中。從我在你的 這個案例中看到的這個應該叫做DTO不是Mapper。

  • 其次,視圖模型的最佳選擇是將原始屬性保存爲 在視圖中顯示不保存導航屬性到模型。

擺脫你的資料庫數據到您的視圖模型(列表或單個對象)的最佳方式是使用投影IQueryable<Model>,在這種情況下,你不需要你剛纔創建DTO使投影到合適的ViewModel

eg

var list = repository.Query.Select(m=>new ViewModel{ 
             First = m.First.Something, 
             Second = m.Second.SomethingElse}); 

更新:

閱讀您的評論,然後在您需要的DTO「數據傳輸對象」從你的資源庫退回或者您也可以直接回到您的視圖模型。 這取決於您的應用程序的複雜程度以及您想要管理的人員。

+0

當然。因爲我沒有使用實體框架。我的存儲庫使用ADO.NET調用數據庫。那麼如何爲查詢操作實現IQueryable ? – 2013-05-08 06:11:22

相關問題