一:介紹
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); } }