如何在 Asp.Net 5 核心应用程序中配置 AutoMapper?

How to configure AutoMapper in Asp.Net 5 Core app?

我正在尝试在我的 Asp.NET 5 Core 项目中使用 AutoMapper。

在我项目的启动文件中,我添加了以下内容

Type[] types = all scannable types...

services.AddAutoMapper((serviceProvider, MapperExpression) =>
{
    // Not sure if this is needed
    MapperExpression.ConstructServicesUsing(t => serviceProvider);

    // Manually add the mapping without using a profile for now..
    MapperExpression.CreateMap(typeof(User), typeof(UserViewModel));

}, types);

综上所述,我希望能够将UserViewModel映射到User。但是,我收到以下错误

AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types: Object -> User System.Object - User

这是我从控制器调用 AutoMapper 的方式

[ApiController]
public class UsersController : ControllerBase
{
    private readonly IMapper _mapper;

    public UsersController(IMapper mapper)
    {
        _mapper = mapper;
    }

    public async Task<ActionResult<DisplayUserViewModel>> Create([FromBody] UserViewModel viewModel)
    {
        User model = _mapper.Map<User>(viewModel);

        //...
    }
}

这是我的模型

public class UserViewModel
{
    [Required]
    public string Password { get; set; }

    [Required]
    public string Email { get; set; }

    [Required]
    public string UserName { get; set; }

    [Required]
    public string FirstName { get; set; }
    public string MiddleName { get; set; }

    [Required]
    public string LastName { get; set; }
}

public class User : IdentityUser<int>
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
}

如何将 AutoMapper 服务正确添加到我的 .Net 5 核心项目?

需要 2 个东西:

  1. Startup.cs 文件中:

    services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
    
  2. 您可以为您的映射创建一个文件夹并将其命名为 MappingProfiles 或您想要的任何名称。然后添加你的映射配置文件 classes,注意,class 应该继承自 AutoMapper 命名空间的 Profile 对象,并在构造函数中进行映射。

     public class UserProfile : Profile
     {
         CreateMap<UserViewModel, User>();
     }
    

在你的情况下,它不起作用,因为你做错了映射方向。你需要把它弄反了。

更改为:

MapperExpression.CreateMap(typeof(UserViewModel), typeof(User));