automapper 配置文件在 api 控制器中不起作用

automapper profile do not work in api controller

我有两个类:

public class Parametro
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public int TipoDatoId { get; set; }
    public TipoDato TipoDato { get; set; }
}

public class ParametroCreateViewModel
{
    public string Nombre { get; set; }
    public int TipoDatoId { get; set; }
}

当我这样安装时_mapper.Map(模型);我收到以下错误:

Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters ParametroCreateViewModel-> Parametro(Destination member list) ProyectoTest.ServiciosCliente.Application.Parametros.Commands.AddFParametro.ParametroCreateViewModel-> Calidda.ServiciosCliente.Domain.Parametros.Parametro(Destination member list) Unmapped properties: Id

但是当我以这种方式尝试时,如果它有效: Mapper.Map (模型);

我的 autofac 如下:

builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile));
            builder.Register(c => new MapperConfiguration(cfg =>
            {
                foreach (var profile in c.Resolve<IEnumerable<Profile>>())
                {
                    cfg.AddProfile(profile);
                }
            })).AsSelf().SingleInstance();
            builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();

我的自动映射器配置是:

public class AutoMapperConfig : Profile
{
    public static void Initialize()
    {
        Mapper.Initialize((config) =>
        {

config.CreateMap<ParametroCreateViewModel, Parametro>()
            .ForMember(dest => dest.Id, opt => opt.Ignore()).ReverseMap();
        }
     }
   }

并声明我的 global.asax:

AutofacConfig.Register();
AutoMapperConfig.Initialize();
GlobalConfiguration.Configure(WebApiConfig.Register);

看起来这里是几个问题的组合。您应该使用配置文件 classes 加载某些程序集,并将它们注册为 Profile。在您的示例中,foreach 循环没有执行任何迭代,因为容器不包含 Profile 的任何注册。要创建映射,您应该使用配置文件本身而不是静态 Mapper class。未调用静态方法 Initialize,因此未创建映射。请考虑这个例子:

public class AutoMapperConfig : Profile
{
    public AutoMapperConfig()
    {
        // Create mapping within profile in constructor
        CreateMap<ParametroCreateViewModel, Parametro>()
            // ignore both unmapped properties
            .ForMember(dest => dest.Id, opt => opt.Ignore())
            .ForMember(dest => dest.TipoDato, opt => opt.Ignore())
            .ReverseMap();
    }
}

[Test]
public void AutoMapperAutofacTest()
{
    // Arrange
    var builder = new ContainerBuilder();

    // load certain assembly
    builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(AutoMapperConfig)))
            .AssignableTo<Profile>()
            .As<Profile>(); // register as profile
    builder.Register(c => new MapperConfiguration(cfg =>
    {
        foreach (var profile in c.Resolve<IEnumerable<Profile>>())
        {
            cfg.AddProfile(profile);
        }
    })).AsSelf().SingleInstance();
    builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();
    var container = builder.Build();

    var mapper = container.Resolve<IMapper>();

    var param = new Parametro();
    var viewModel = new ParametroCreateViewModel
    {
        Nombre = "Nombre",
        TipoDatoId = 1
    };

    // Act
    mapper.Map(viewModel, param);

    //Assert
    Assert.AreEqual(param.TipoDatoId, 1);
    Assert.AreEqual(param.Nombre, "Nombre");
}

我已经用测试包装了示例以使其可重现。希望对你有帮助。