ASP.NET C# MVC ViewModel with valueinjecter

Introduction

Model 跟 ViewModel 這塊之前一直沒有發現比較好的方式去處理,Model 跟 ViewModel 在設計的時候通常都是會有一些關聯,但是又希望他們可以獨立運作不要關聯,真的需要用到他們的關係又可以很方便的去使用。在 presentation layer 跟 Domain model 應該是要可以分離的很徹底,又可以準確的被轉換。

image

可以看到在 Service 勢必要將 ViewModel 跟 Model 做一個轉換才能繼續接下來的動作,雖然這是兩個不同的東西,但是大多數情況下,他們之間還是會有斷不掉的羈絆,最近接了同事的案子用到了一個工具Value Injecter

Value Injecter

image

▲直接在 NuGet 上面就可以找到了

這個東西可以幹嘛呢,就是幫你把物件的值注入到另一個物件中,兩個物件可以完全獨立不用任何參考。

Implement

這邊主要的目的只是要建立一個訂單服務,傳入訂單資料,然後到資料庫去建立一份訂單起來。

image

▲Service 的建立訂單,看得出來這邊只接受 Domain.Order ,不接受 ViewModel 的型態,所以這邊需要的就是將 IOrderModel 轉變成可用的 Domain.Order。

image

▲終於輪到 ValueInjecter 出場了,在這邊將 ViewModel 傳入的資料注入我們需要的物件。

image

▲再來我們直接用Cart 這個 ViewModel 來呼叫 Service 的 Submit method

image

▲Injecter 的結果,直接的屬性可以被注入,可是再下層的 OrderDetails 卻沒有帶回應該有的部分。

在來改寫一下 inject 的部分,要完成 Inject 的動作必須要達成兩個條件

1.型態完全相同

2.命名完全一樣(包括大小寫)

image

▲InjectFrom 的時候可以自訂加入要一起作注入的物件,在這個時候先到底下關聯的部分先做轉換,所以這邊OrderDetails 接到的會是完全正確的 ICollection<OrderDetail> OrderDetails ,符合命名跟型態兩個條件。

image

▲將相關聯的部分也一併轉入

Reference

Value Injecter – object(s) to -> object mapper

http://valueinjecter.codeplex.com/releases/view/60311

快速搬移物件內的資料至其他型別 – .NET ValueInjecter

http://kelp.phate.org/2011/08/net-valueinjecter.html

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *