Я использую сопоставление по соглашению и у меня возникают проблемы при добавлении профиля в конфигурацию.Рассмотрим конфигурацию ниже.Я использую 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 в упомянутом профиле, онбрейки.Мне кажется, что он почему-то забывает о конфигурации, даже если это не имеет к этому никакого отношения.