简单来说,AutoMapper就是一个用C#语言开发的一个轻量的处理一个实体对象到另外一个实体对象映射关系的组件库
官网地址:AutoMapper
文档地址:AutoMapper — AutoMapper documentation
层与层之间的数据转换是非常常见的事情,最简单的方式就是手动复制,(尤其使用SqlSugar之后,如果不做特殊处理,数据查询的结果一般为全字段,但是在业务层,我们提供的对外接口一般只返回有限的部分字段)当然,使用AutoMapper之后可以大大简化繁琐的工作,
builder.Services.AddScoped();
显然,仅仅注入IMapper之后,我们还是无法使用的,还需要在Config中初始化MapperConfiguration对象,然后我们在MapperConfiguration对象中配置两个实体对象,官网提供的例子如下,我们可以这样使用
- var config = new MapperConfiguration(cfg => {
- cfg.CreateMap
(); - cfg.AddProfile
(); - });
当然我们也可以这样使用
- public class OrganizationProfile : Profile
- {
- public OrganizationProfile()
- {
- CreateMap
(); - // Use CreateMap... Etc.. here (Profile methods are the same as configuration methods)
- }
- }
cfg.AddProfile();
想想我们要做的工作,每增加一个对象映射,我们就需要在Program中注入一个配置文件,这样将会导致我们的Program臃肿不堪。而且不方便管理,那我们应该怎么办?有没有一劳永逸的方法。
对,我们需要注入Profile,我的代码结构如下:

该类库中的所有对象都用来处理该模块中的对象映射,如下所示:
- public class AuthManageProfile: Profile
- {
- public AuthManageProfile()
- {
- //获取表单功能列表
- CreateMap
(); -
- CreateMap
(); -
- //菜单授权信息
- CreateMap
(); -
- //表单授权信息
- CreateMap
(); -
- //表单功能授权信息
- CreateMap
(); - }
- }
我们怎么办呢,我们只需要一次性注入就好。
builder.Services.AddAutoMapper(Assembly.Load("SoingSoft.Business.AutoMapper").DefinedTypes.Where(t => typeof(Profile).GetTypeInfo().IsAssignableFrom(t.AsType())).Select(t => t.AsType()).ToArray());
这段代码很关键,该代码的作用是使用反射将SoingSoft.Business.AutoMapper类库中的所有继承自Profile类的所有对象注入。
我们只需要在Controller中注入我们的IMaaper对象就可以了。

然后我们在对象的Profile对象中,增加我们的映射
- public class UserRoleManageProfile: Profile
- {
- public UserRoleManageProfile()
- {
- CreateMap
(); - }
- }
注意:前边为我们的数据实体,后边为我们需要映射的对象
最后,我们只要在代码中直接使用Map方法即可完成映射
result.arr_role = _mapper.Map>(_roleDataService.GetList());