профиль autopper не работает в контроллере API - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть два класса:

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 (модель); Я получаю следующую ошибку:

Найдены не нанесенные на карту участники. Просмотрите типы и членов ниже. Добавьте пользовательское выражение сопоставления, игнорируйте, добавьте пользовательский преобразователь или измените тип источника / назначения. Если нет подходящего конструктора, добавьте c-аргумент без аргументов, добавьте необязательные аргументы или сопоставьте все параметры конструктора. ParametroCreateViewModel-> Parametro (список членов назначения)

но когда я пытаюсь это так, если это работает: Mapper.Map (модель);

Мой автофак выглядит следующим образом:

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 Ответ

0 голосов
/ 14 сентября 2018

Похоже, здесь есть комбинация нескольких вопросов.Вы должны загрузить определенную сборку с классами профиля, а также зарегистрировать их как 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");
}

Я завернул пример тестом, чтобы сделать его воспроизводимым.Надеюсь, это поможет.

...