C# 自动映射配置文件在api控制器中不工作

C# 自动映射配置文件在api控制器中不工作,c#,api,automapper,autofac,profile,C#,Api,Automapper,Autofac,Profile,我有两门课: 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 Nom

我有两门课:

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(model);我得到以下错误:

找到了未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析程序或修改无匹配构造函数的源/目标类型、添加无参数构造函数、添加可选参数或映射所有构造函数参数 ParametroCreateViewModel->Parametro(目标成员列表)ProyectoTest.serviciciosclient.Application.Parametros.Commands.AddFParametro.ParametroCreateViewModel->Calidda.serviciciosclient.Domain.Parametros.Parametro(目标成员列表)未映射属性:Id

但当我尝试这种方法时,如果它有效: Mapper.Map(model)

我的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();

看起来这里是几个问题的组合。您应该使用概要文件类加载某些程序集,并将它们注册为
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");
}
public类AutoMapperConfig:Profile
{
公共自动映射配置()
{
//在构造函数中的概要文件中创建映射
CreateMap()
//忽略两个未映射的属性
.FormMember(dest=>dest.Id,opt=>opt.Ignore())
.ForMember(dest=>dest.TipoDato,opt=>opt.Ignore())
.ReverseMap();
}
}
[测试]
公共void autofactest()
{
//安排
var builder=new ContainerBuilder();
//加载某些组件
builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(AutoMapperConfig)))
.可转让给
.As();//注册为配置文件
builder.Register(c=>newmapperconfiguration(cfg=>
{
foreach(c.Resolve()中的变量配置文件)
{
cfg.AddProfile(profile);
}
})).AsSelf().SingleInstance();
builder.Register(c=>c.Resolve().CreateMapper(c.Resolve)).As().InstancePerLifetimeScope();
var container=builder.Build();
var mapper=container.Resolve();
var param=新参数();
var viewModel=新参数createviewmodel
{
Nombre=“Nombre”,
TipoDatoId=1
};
//表演
mapper.Map(视图模型,参数);
//断言
Assert.AreEqual(param.TipoDatoId,1);
Assert.AreEqual(param.Nombre,“Nombre”);
}

我已经用test包装了这个示例,以使其可复制。希望能有所帮助。

乐意帮忙=)
AutofacConfig.Register();
AutoMapperConfig.Initialize();
GlobalConfiguration.Configure(WebApiConfig.Register);
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");
}