ASP.NET Core中使用AutoMapper實現自動轉化


一:介紹

AutoMapper的功能就是實現映射一個對象到另一個對象的自動化工具,最常見的就是DTO (Data Transfer Object)與MO(ModelObject)之間的轉換。

現在有兩個類,實體類Blogs和BlogsView之間的轉化

[Table("Blog")]
    public class Blog: BaseEntity
    {
        [Key]
        public int Id { get; set; }
        public string Title { get; set; }
        public string Link { get; set; }
        public DateTime? Date { get; set; }
        public string Author { get; set; }
        public string Tag { get; set; }
    }
public class BlogView
    {
        public int Id { get; set; }
        public string TitleName { get; set; }
        public string Link { get; set; }
        public DateTime? Date { get; set; }
        public string Author { get; set; }
        public string Tag { get; set; }
    }

二:使用

(1)  安裝AutoMapper

右鍵項目打開NuGet程序管理包,安裝AutoMapper和AutoMapper.Extensions.Microsoft.DependencyInjection

AutoMapper.Extensions.Microsoft.DependencyInjection,這個是用來配合依賴注入的,

在項目當中,都使用依賴注入,盡量不要用new 來實例化,導致層耦合

 

(2) 添加映射文件

在安裝項目中新建Automapper文件夾,然后創建AutomapperConfig.cs文件繼承自Profile類,用來配置所有的映射關系。

 

public class AutomapperConfig : Profile
    {
        public AutomapperConfig()
        {
            CreateMap<Blog, BlogView>().ForMember(e => e.TitleName, v => v.MapFrom(a => a.Title));
        }
    }

這里的 Profile有什么用呢,是 services.AddAutoMapper他會自動找到所有繼承了Profile的類然后進行配置。我這個類是放在Service層的

使用AutoMapper實現模型映射,並注入

那此時Startup類里面的配置就可以寫成 services.AddAutoMapper(Assembly.Load("Service"));它會自動加載Service的程序集並從這里面找到繼承了profile類的配置實現。

(3) 使用mapper

 /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="blogData"></param>
        public BlogService(IBlogData blogData, IMapper mapper)
        {
            _blogData = blogData;
            _mapper = mapper;
        }
 BlogView model = new BlogView();
 _mapper.Map(blog, model);

這時就會把Blog屬性值映射到BlogView實體中了

當兩個實體類屬性不同時可以通過配置的方式進行映射

CreateMap<Blog, BlogView>().ForMember(e => e.TitleName, v => v.MapFrom(a => a.Title))

當不想對某個屬性進行映射我們可以忽略

.ForMember(e => e.Author, v => v.Ignore());

 

AutoMap幫助類:

    /// <summary>
    /// AutoMapper的幫助類
    /// </summary>
    public static class AutoMapperHelper
    {
        /// <summary>
        /// 單條實體類型映射,默認字段名字一一對應
        /// </summary>
        /// <typeparam name="TSource">Dto類型</typeparam>
        /// <typeparam name="TDestination">要被轉化的數據</typeparam>
        /// <param name="source">轉化之后的實體</param>
        /// <returns></returns>
        public static TDestination MapTo<TSource, TDestination>(this TSource source)
            where TDestination : class, new()
            where TSource : class
        {
            if (source == null) return new TDestination(); 
            var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>());
            var mapper = config.CreateMapper();
            return mapper.Map<TDestination>(source);
        }

        /// <summary>
        /// 實體列表類型映射,默認字段名字一一對應
        /// </summary>
        /// <typeparam name="TDestination">Dto類型</typeparam>
        /// <typeparam name="TSource">要被轉化的數據</typeparam>
        /// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param>
        /// <returns>轉化之后的實體列表</returns>
        public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source)
            where TDestination : class
            where TSource : class
        {
            if (source == null) return new List<TDestination>();
            var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>());
            var mapper = config.CreateMapper();
            return mapper.Map<List<TDestination>>(source);
        }




    }

 


免責聲明!

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



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