Automapper - Ошибка карты после добавления профиля - PullRequest
0 голосов
/ 29 мая 2018

Я использую сопоставление по соглашению и у меня возникают проблемы при добавлении профиля в конфигурацию.Рассмотрим конфигурацию ниже.Я использую AutoFac для разрешения профилей в CoreMapper, и профили корректно вводятся.

Конфигурация отображения

public CoreMapper(IEnumerable<Profile> profiles)
{
    MapperConfiguration = new MapperConfiguration(cfg =>
    {
        cfg.CreateMissingTypeMaps = true;
        cfg.AllowNullCollections = true;
        cfg.AllowNullDestinationValues = true;
        cfg.ForAllMaps((mapType, mapperExpression) =>
        {
            mapperExpression.PreserveReferences();
            mapperExpression.MaxDepth(10);
        });
        cfg.IgnoreUnmapped();
        foreach (var profile in profiles)
        {
            cfg.AddProfile(profile);
        }
        cfg.CreateMap<string, string>().ConvertUsing(str => string.IsNullOrEmpty(str) ? null : str);
    });
    Mapper = MapperConfiguration.CreateMapper();
}

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

private static void IgnoreUnmappedProps(TypeMap map, IMappingExpression expression)
{
    foreach(var propName in map.GetUnmappedPropertyNames())
    {
        if (map.SourceType.GetProperty(propName) != null)
            expression.ForSourceMember(propName, opt => opt.Ignore());
        if (map.DestinationType.GetProperty(propName) != null)
            expression.ForMember(propName, opt => opt.Ignore());
    }
}

public static void IgnoreUnmapped(this IProfileExpression profile)
{
    profile.ForAllMaps(IgnoreUnmappedProps);
}

В моем кодеУ меня есть реализация универсального класса со следующей строкой:

mapper.Map<TPoco>(entity);

Примечание : mapper является экземпляром CoreMapper сверху.где TPoco - это модель POCO, определенная следующим образом:

public class ModelPoco : IModel {
    // props
}

, а сущность - модель сущности базы данных.

Отображение работает нормально.Результат mapper.Map (entity) правильный.

Затем я продолжаю и добавляю профиль для конкретной карты , которая вообще не связана к ModelPoco , отображаемому ранее.

Добавляемый профиль:

public class  RepositoryLayerProfile : AutoMapper.Profile {
    public RepositoryLayerProfile() {
        CreateMap<SomeOtherEntity, ISomeOtherModelInterface>();
    }
}

Версия: 6.2.2

Ожидаемое поведение

Отображение ModelEntity в ModelPoco должно происходить нормально.

Фактическое поведение

Отображение прерывается сообщением: Невозможно привести объект типа 'Proxy ' к типу 'ModelPoco '. on line mapper.Map (entity);

Я не уверен, почему он создает класс Proxy для интерфейса IModel, а затем пытается привести к конкретной реализации?Я явно установил, что хочу сопоставить сущность с конкретной реализацией.

Если я удаляю CreateMap из профиля, он работает нормально, но в первый раз, когда я определяю CreateMap в упомянутом профиле, онбрейки.Мне кажется, что он почему-то забывает о конфигурации, даже если это не имеет к этому никакого отношения.

...