使用 ValueInjecter 來做自動Mapping

在 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