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.Mapbuilder.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");
}