2016-10-31 6 views
1

Здравствуйте, я не могу получить мои сопоставления, работающие в унаследованном классе. Идея заключается в создании карты для базового объекта и интерфейса только один раз, а когда дочерние классы реализуют свои собственные члены, настройте отображение nly для тех членов, которые не определены в базовом классе или внутри.Automapper 5.1.1 сопоставление наследования

Позвольте мне привести пример кода.

public class DtoClass { 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
    public string Field3 { get; set; } 
} 

public interface IField3 { 
    public string EntityField3 { get; set; } 
} 

public class BaseEntityClass { 
    public string EntityField1 { get; set; } 
} 

public class ChildEntityClass : BaseEntityClass, IField3 { 
    public string EntityField2 { get; set; } 
    public string EntityField3 { get; set; } 
} 


CreateMap<BaseEntityClass, DtoClass>() 
    .ForMember(c => c.Field1 , m => m.MapFrom(a => a.EntityField1)) 
    .Include<ChildEntityClass, DtoClass>(); 

CreateMap<IField3, DtoClass>() 
    .ForMember(c => c.Field3 , m => m.MapFrom(a => a.EntityField3)); 

CreateMap<ChildEntityClass, DtoClass>() 
    .ForMember(c => c.Field2 , m => m.MapFrom(a => a.EntityField2)); 

Прилагается код dosnt work ofcourse. при вызове:

AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass); 

Я получаю только сопоставляются элементы, которые определены в CreateMap<ChildEntityClass, DtoClass>().

Любая идея, как только один раз реализовать отображения для базового класса и интерфейсов? И да, я хочу наметить все типы ChildEntityClass, BaseEntityClass и IField3 для DtoClass.

Любые подсказки приветствуются для элегантной конфигурации таких сопоставлений.

Edit: я удалить unecssary IncludeBase из подкласса для ясности, но ни один из обоих
- IncludeBase в подклассе - не включать в базовый класс работает для меня. Что может вызвать такие проблемы?

ответ

0

Как это часто бывает проблема выходят за рамки я произнесенной в примере кода.

В моем проекте в методе инициализации скрывался вызов что-то вроде:

 foreach (string propName in map.GetUnmappedPropertyNames()) 
     { 
      expr.ForMember(propName, opt => opt.Ignore()); 
     } 

Таким образом, все столбцы не отображенные в подклассе автоматически игнорируются даже при вызове отображения для базового типа. Простой, но проблематичный.

Такой код, как указано выше, был, вероятно, переписан для Mapper.Configuration.AssertConfigurationIsValid();.

0

Вы не должны использовать .IncludeBase И .Include - выберите один и придерживайтесь его. Я предпочитаю .IncludeBase, так как я думаю, что имеет смысл определять в подклассе. В вашем случае вы не можете ссылаться на IField3 с помощью Include, потому что нет никакого неявного преобразования.

Следующий код работает, используя IncludeBase для меня

CreateMap<BaseEntityClass, DtoClass>() 
    .ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.EntityField1)) 
    ; 

CreateMap<IField3, DtoClass>() 
    .ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.EntityField3)) 
    ; 

CreateMap<ChildEntityClass, DtoClass>() 
    .ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.EntityField2)) 
    .IncludeBase<BaseEntityClass, DtoClass>() 
    .IncludeBase<IField3, DtoClass>() 
    ; 
+0

Нет, все еще не работает, вызывается только сопоставление, настроенное как последнее, без базового класса. Для меня не включается в базовый класс. И еще один вопрос: какой интерфейс? Я удалил IncludeBase <> в примере кода для ясности. – PabloPC

+0

Убедитесь, что вы проверили свои профили, используя Mapper.AssertConfigurationIsValid(). Это может указывать на то, что вызывает проблемы. – Richard

+0

Обновлен мой ответ, используя IncludeBase, который работает для меня, используя ваш пример кода. – Richard