.net Core中使用AutoMapper


第一種:只引用AutoMapper包寫一個AutoMapperExtension的擴展方法

廢話不多說擴展方法代碼如下

  1 /// <summary>
  2     /// AutoMapper擴展
  3     /// </summary>
  4     public static class AutoMapperExtension
  5     {
  6         /// <summary>
  7         /// 類型映射
  8         /// </summary>
  9         /// <typeparam name="TDestination">映射后的對象</typeparam>
 10         /// <param name="obj">要映射的對象</param>
 11         /// <returns></returns>
 12         public static TDestination MapTo<TDestination>(this object obj) where TDestination : class
 13         {
 14             if (obj == null) return default(TDestination);
 15             var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, object>());
 16             var mapper = config.CreateMapper();
 17             return mapper.Map<TDestination>(obj);
 18         }
 19 
 20         /// <summary>
 21         /// 集合列表類型映射
 22         /// </summary>
 23         /// <typeparam name="TDestination">目標對象類型</typeparam>
 24         /// <param name="source">數據源</param>
 25         /// <returns></returns>
 26         public static List<TDestination> MapTo<TDestination>(this IEnumerable<TDestination> source) where TDestination : class
 27         {
 28             if (source == null) return default(List<TDestination>);
 29 
 30             var config = new MapperConfiguration(cfg => cfg.CreateMap(source.GetType(), typeof(TDestination)));
 31             var mapper = config.CreateMapper();
 32             return mapper.Map<List<TDestination>>(source);
 33         }
 34 
 35         /// <summary>
 36         /// 集合列表類型映射
 37         /// </summary>
 38         /// <typeparam name="TSource">數據源類型</typeparam>
 39         /// <typeparam name="TDestination">目標對象類型</typeparam>
 40         /// <param name="source">數據源</param>
 41         /// <returns></returns>
 42         public static List<TDestination> MapTo<TSource, TDestination>(this IEnumerable<TSource> source)
 43             where TDestination : class
 44             where TSource : class
 45         {
 46             if (source == null) return new List<TDestination>();
 47 
 48             var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>());
 49             var mapper = config.CreateMapper();
 50             return mapper.Map<List<TDestination>>(source);
 51         }
 52 
 53         /// <summary>
 54         /// 集合列表類型映射
 55         /// </summary>
 56         /// <typeparam name="TSource">數據源類型</typeparam>
 57         /// <typeparam name="TDestination">目標對象類型</typeparam>
 58         /// <param name="source">數據源</param>
 59         /// <param name="configure">自定義配置</param>
 60         /// <returns></returns>
 61         public static List<TDestination> MapTo<TSource, TDestination>(this IEnumerable<TSource> source, Action<IMapperConfigurationExpression> configure)
 62             where TDestination : class
 63             where TSource : class
 64         {
 65             if (source == null) return new List<TDestination>();
 66 
 67             var config = new MapperConfiguration(configure);
 68             var mapper = config.CreateMapper();
 69             return mapper.Map<List<TDestination>>(source);
 70         }
 71 
 72         /// <summary>
 73         /// 類型映射
 74         /// </summary>
 75         /// <typeparam name="TSource">數據源類型</typeparam>
 76         /// <typeparam name="TDestination">目標對象類型</typeparam>
 77         /// <param name="source">數據源</param>
 78         /// <param name="destination">目標對象</param>
 79         /// <returns></returns>
 80         public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
 81             where TSource : class
 82             where TDestination : class
 83         {
 84             if (source == null) return destination;
 85 
 86             var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>());
 87             var mapper = config.CreateMapper();
 88             return mapper.Map<TSource, TDestination>(source, destination);
 89         }
 90 
 91         /// <summary>
 92         /// 類型映射,默認字段名字一一對應
 93         /// </summary>
 94         /// <typeparam name="TDestination">轉化之后的model,可以理解為viewmodel</typeparam>
 95         /// <typeparam name="TSource">要被轉化的實體,Entity</typeparam>
 96         /// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param>
 97         /// <returns>轉化之后的實體</returns>
 98         public static TDestination MapTo<TSource, TDestination>(this TSource source)
 99             where TDestination : class
100             where TSource : class
101         {
102             if (source == null) return default(TDestination);
103 
104             var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>());
105             var mapper = config.CreateMapper();
106             return mapper.Map<TDestination>(source);
107         }
108 
109     }
View Code

使用AutoMapper推薦這個AutoMapperExtension.MapTo<TSource, TDestination>(this TSource source);方法

 class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student
            {
                Id=5,
                Name="張三",
                Email="146855"
            };
            StudentView model = AutoMapperExtension.MapTo<Student,StudentView>(student);
            bool b = model is null;
            Console.WriteLine(b);
            Console.ReadKey();
        }
    }

    public class Student
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string Email { get; set; }

    }
    public class StudentView
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string Email { get; set; }
        public string ClassName { get; set; }

    }
View Code

結果如下student轉化studentView成功

第二種:寫一個配置類懶得寫直接參考下面的文章,麻煩一點

文章來自https://www.cnblogs.com/chenxi001/archive/2019/11/05/11800943.html

在我們的項目中慢慢的要把數據庫的實體模型和視圖模型進行分離,防止被人拿到我們表字段。在學校的時候自己只是有將很多數據庫模型,寫成一個視圖模型返回到前台。

 首先我們把這兩個包引入項目中去。

然后我們創建一個轉換配置類,這個類要繼承 Profile 將我們需要轉換的類寫到我們構造函數里面去,這里要注意我們左邊的UserEntity是要將這個類型的數據轉換成UserModel

當然這個可以反過來,但是你轉換的關系一定要正確,左為要轉換的數據類型,右邊是轉換后的數據類型。(我已經幫你們測試了,關系不對亂轉報錯。)

在Startup 寫入注入這個配置

 

下面我們創建兩個類

這個是我們平常中數據庫表實體

這是我們的視圖模型

 這個里要注意,在轉化的時候只有名字相同的字段才會成功附上對應的值。(大小寫可以不管,但是在項目中要做到一致,我上面沒有一致是測試一下。)

然后就是使用了

我們只要在使用的地方,注入進來了,就可以使用了。

這個是單個實體的轉換

 簡寫方法,直接寫要轉成什么類型就可以了,但是轉換的配置類法不變。

 當然我們還有集合的轉換了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM