2016-02-17 2 views
2

Я пытаюсь использовать IncludeBase. Кажется, что он имеет проблемы с одинаковыми именованными свойствами в базовых классах. Они не включены в базовое сопоставление, но автоматически разрешены. Я использую automapper версии 4.2.AutoMapper - IncludeBase с игнорированием такого же имени свойства

Ситуация похожа на это:

class Program 
{ 
    static void Main(string[] args) 
    { 
     MapperConfiguration conf = new MapperConfiguration((cfg) => 
     { 
      cfg.CreateMap<FooBase, FooModelBase>() 
       .ForMember(e => e.Error, opt => opt.Ignore()); 

      cfg.CreateMap<Foo, FooModel>() 
       .IncludeBase<FooBase, FooModelBase>(); 
     }); 

     IMapper mapper = conf.CreateMapper(); 

     //works just fine 
     FooModelBase fooModelBase = mapper.Map<FooModelBase>(new FooBase()); 

     //throws an exception 
     FooModel fooModel = mapper.Map<FooModel>(new Foo()); 
    } 
} 

class FooBase 
{ 
    public string Error { get; set; } 
} 

class Foo : FooBase { } 

class FooModelBase 
{ 
    public string Error 
    { 
     get { throw new NotImplementedException(); } 
     set { throw new NotImplementedException(); } 
    } 
} 

class FooModel : FooModelBase { } 

Я ожидал, что приложение не бросает исключение, но это делает. Любой совет, как решить эту проблему?

ответ

1

Ключевым моментом здесь является, как AutoMapper приоритеты возможных источников на унаследованных отображений

Как вы можете видеть в this link в Automapper GitHub проекта, когда включает в себя унаследовали отображения дополнительной сложность Введены, потому что есть несколько способов, которыми свойство можно сопоставить.

Приоритет этих источников являются:

  1. Явная Mapping (с использованием .MapFrom())
  2. Наследуется Явная Mapping
  3. Игнорирование свойств Mapping
  4. Конвенция Mapping (Свойства, которые подбираются по соглашению)

Так что «Унаследованное игнорирование сопоставления свойств» игнорируется d или имеют меньший приоритет.

Что происходит, так это то, что «Отображение Конвенции» имеет более высокий приоритет, и поэтому свойство все еще отображается.

Вы можете решить эту проблему, добавив явно Ignore() в производной конфигурации карты:

cfg.CreateMap<Foo, FooModel>() 
    .ForMember(e => e.Error, opt => opt.Ignore()) 
    .IncludeBase<FooBase, FooModelBase>(); 
+0

Так что нет никакого другого способа сделать это, либо написать мое собственное включают расширение базы или явно добавить каждый игнорировать отображения из базового класса. Это довольно грустно. – eCorke

+0

@eCorke: Да, они должны добавить способ определения такого поведения –

Смежные вопросы