1. 程式人生 > 其它 >利用AutoMapper實現資料實體類之間的轉換

利用AutoMapper實現資料實體類之間的轉換

在分解複雜的軟體系統時,軟體設計者用得最多的技術之一就是分層。分層右很多優點:如提高複用性、較低耦合性,但也有其缺陷所在:如過多的層次會影響效能、有時會為我們帶來級聯修改。

會帶來級聯修改怎麼理解呢?例如需求變化要增加一個在使用者介面上顯示的資料域,就必須在資料中增加相應欄位,還必須在使用者介面和資料庫之間的每一層做相應的修改。在不同層次中會有不同的資料實體類(有些類還包括一些方法),這些實體類之間為了實現資料傳遞就必須進行類之前的轉換,這樣的轉換可以手寫程式碼進行一對一的轉換完成任務,就像下圖一樣,並且你還得為對應的List<T>類書寫相應的轉換方法,有木有更簡單方便的方案呢?這就要說到標題裡寫的AutoMapper,從名字可以看出這是一款用於對映的工具。

直接上程式碼,第一先定義需要進行轉換的實體類,第二步是繼承Profile介面,進行註冊。

using AutoMapper;

namespace WindowsFormsApp1
{
    /// <summary>
    /// 模仿需要轉換的資料實體類
    /// </summary>
    public class Source
    {
        public int SomeValue { get; set; }
        public string AnotherValue { get; set; }
    }

    /// <summary>
/// 模仿需要轉換的資料實體類 /// </summary> public class Destination { public int SomeValue { get; set; } } /// <summary> /// 通過Profile註冊 /// 告訴AutoMapper需要進行哪些類的轉換,如果A轉換成B,B也要轉換成A,那就需要寫兩條 /// </summary> public class SourceProfile : Profile { public SourceProfile() { CreateMap
<Source, Destination>(); CreateMap<Destination, Source>(); } } }

第三步是將Profile中書寫的對映關係新增到Mapper例項,常規需要書寫一個方法用於獲取唯一的Mapper例項(單例模式),例項中配置了對映關係。

using AutoMapper;

namespace WindowsFormsApp1
{
    public class AutoMapperConfigure
    {
        public static IMapper GetMapper()
        {
            var config = new MapperConfiguration(cfg =>
            {
                // 掃描當前程式集
                cfg.AddMaps(System.AppDomain.CurrentDomain.GetAssemblies());
            });

            var mapper = config.CreateMapper();
            return mapper;
        }
    }
}

第四步具體呼叫,預設情況下,AutoMapper 基於相同的欄位名對映,並且是 不區分大小寫 的。也可以通過修改配置,實現AutoMapper提供的命名規則對映。LowerUnderscoreNamingConventionPascalCaseNamingConvention 是 AutoMapper 提供的兩個命名規則。前者命名是小寫幷包含下劃線,後者就是帕斯卡命名規則(每個單詞的首字母大寫)。

        private void promptMessageButton_Click(object sender, EventArgs e)
        {
            Source source = new Source()
            {
                SomeValue = 1,
                AnotherValue = "Another"
            };

            var mapper = AutoMapperConfigure.GetMapper();
            Destination destination = mapper.Map<Destination>(source);
            MessageBox.Show(destination.SomeValue.ToString());
        }

參考資料:https://www.cnblogs.com/gl1573/p/13098031.html

有興趣的同學還可以看一下官方文件,還有樣例:https://docs.automapper.org/en/latest/

看了部落格的同學建議還是自己動手寫一下,借用荀子的一句話:不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之。