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

我有两节课:


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


未映射的成员被发现。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型对于没有匹配的构造函数,添加无参数 ctor、添加可选参数或映射所有构造函数参数 ParametroCreateViewModel-> Parametro(Destination member列表)ProyectoTest.ServiciosCliente.Application.Parametros.Commands.AddFParametro.ParametroCreateViewModel-> Calidda.ServiciosCliente.Domain.Parametros.Parametro(目标成员列表)未映射的属性:Id


但是当我这样尝试时,如果它有效: Mapper.Map < ParametroCreateViewModel,Parametro > (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();

我的 automapperconfig 是:


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);


慕容森
浏览 249回答 1
1回答

慕莱坞森

看起来这里是几个问题的组合。您应该使用配置文件类加载某些程序集,并将它们注册为Profile. 在您的示例中, foreach 循环没有执行任何迭代,因为容器不包含任何注册Profile。要创建映射,您应该使用配置文件本身而不是静态Mapper类。未调用静态方法Initialize,因此未创建映射。请考虑这个例子:public class AutoMapperConfig : Profile{&nbsp; &nbsp; public AutoMapperConfig()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; // Create mapping within profile in constructor&nbsp; &nbsp; &nbsp; &nbsp; CreateMap<ParametroCreateViewModel, Parametro>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ignore both unmapped properties&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ForMember(dest => dest.Id, opt => opt.Ignore())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ForMember(dest => dest.TipoDato, opt => opt.Ignore())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ReverseMap();&nbsp; &nbsp; }}[Test]public void AutoMapperAutofacTest(){&nbsp; &nbsp; // Arrange&nbsp; &nbsp; var builder = new ContainerBuilder();&nbsp; &nbsp; // load certain assembly&nbsp; &nbsp; builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(AutoMapperConfig)))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .AssignableTo<Profile>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .As<Profile>(); // register as profile&nbsp; &nbsp; builder.Register(c => new MapperConfiguration(cfg =>&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; foreach (var profile in c.Resolve<IEnumerable<Profile>>())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cfg.AddProfile(profile);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; })).AsSelf().SingleInstance();&nbsp; &nbsp; builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();&nbsp; &nbsp; var container = builder.Build();&nbsp; &nbsp; var mapper = container.Resolve<IMapper>();&nbsp; &nbsp; var param = new Parametro();&nbsp; &nbsp; var viewModel = new ParametroCreateViewModel&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Nombre = "Nombre",&nbsp; &nbsp; &nbsp; &nbsp; TipoDatoId = 1&nbsp; &nbsp; };&nbsp; &nbsp; // Act&nbsp; &nbsp; mapper.Map(viewModel, param);&nbsp; &nbsp; //Assert&nbsp; &nbsp; Assert.AreEqual(param.TipoDatoId, 1);&nbsp; &nbsp; Assert.AreEqual(param.Nombre, "Nombre");}我已经用测试包装了这个例子,以使其可重现。希望能帮助到你。
打开App,查看更多内容
随时随地看视频慕课网APP