亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C#
慕容森 2022-01-16 15:38:36
我有兩節課: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);
查看完整描述

1 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

看起來這里是幾個問題的組合。您應該使用配置文件類加載某些程序集,并將它們注冊為Profile. 在您的示例中, foreach 循環沒有執行任何迭代,因為容器不包含任何注冊Profile。要創建映射,您應該使用配置文件本身而不是靜態Mapper類。未調用靜態方法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");

}

我已經用測試包裝了這個例子,以使其可重現。希望能幫助到你。


查看完整回答
反對 回復 2022-01-16
  • 1 回答
  • 0 關注
  • 224 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號