在 Coding 的時候,難免會遇到需要做 Model mapping 的時候,最近因為同事使用 ValueInjecter 才得知有這個輕巧好上手的工具
這個工具的概念其實很簡單
如果你要從 A model Mapping 至 B model,最笨的方法就是自己一個欄位一個欄位mapping
但如果你的來源與目的端的model 都有共同的欄位時
這樣子做不但浪費你的寶貴時間,也非常的不聰明
當然你也有可能會找尋好用的 mapping 工具,例如 autoMapper, ValueInjecter... 等的工具
而這邊要介紹的就是ValueInjecter 這個好上手又易學的工具
從上面的例子,我們可以很清楚的知道,mapping工具最重要的就是來源跟目地端的 property 欄位怎麼對應
如果我們有一個叫做 人(PersonModel),而我們想要把這個Model 轉換成動物(AnimalModel)
而這兩個Model 有相同的屬性時,我們想要將它自動mapping起來,該怎麼做呢?
public class PersonModel
{
public string Name { get; set; }
public int Id { get; set; }
public bool IsMarried { get; set; }
}
public class AnimalModel
{
public string Name { get; set; }
public int? Id { get; set; }
}
人有身份證字號 (Id), 與是否結婚(IsMarried)
但動物端卻不一定會有牠們的晶片Id (如果你收養了,且有幫注射晶片的話)
在 ValueInjecter 你只需要做這三件事就可以了
1. nuget 取得Omu.ValueInjecter
2. 建立mapping 的方式,設定你的match types
這邊我們想做的事,如果來源端或是目地端都是同一種型別
但如果是 nullable的話,我們還是想要做mapping
public class ClassAutoInjectNullable : LoopInjection
{
protected override bool MatchTypes(Type sourceType, Type targetType)
{
var sourceNullableType = Nullable.GetUnderlyingType(sourceType);
var targetNullableType = Nullable.GetUnderlyingType(targetType);
return sourceType == targetType
|| sourceType == targetNullableType
|| targetType == sourceNullableType
|| sourceNullableType == targetNullableType;
}
}
3. 執行mapping
PersonModel personModel = new PersonModel() { Name = "Ace", Id = 1, IsMarried = false };
AnimalModel animalModel = new AnimalModel();
animalModel.InjectFrom<ClassAutoInjectNullable>(personModel);
真是輕鬆又快樂
如此一來我們就可以把人的類別對應到動物的類別了,連nullable的屬性都可以
至於步驟2 所用到的loopInjection,你也可以選擇其他 injection 的方式,以下是valueInector所提供的
而loopInjection 的原始 mapping 方式則是長成這樣,所以只有來源名稱跟型別一樣才能mapping
若要做其他不同的match types的話,可以在這邊動手腳,overwite 原本的方法
protected virtual bool MatchTypes(Type source, Type target)
{
return source == target;
}
參考連結(筆者現在看到的版本並沒有像這個連結可以有這麼多花式設定,不過也還算是夠用了)
http://sampathloku.blogspot.tw/2012/11/how-to-use-valueinjecter-with-aspnet.html