2013-04-12 3 views
1

У меня есть коллекция EntityDtos.AutoMapper и базовые типы

Каждое свойство EntityDto имеет свойство EntityType.

Каждый из этих EntityTypes соответствуют различным подклассу, что-то вроде этого

abstract class EntityBase { EntityType = EntityType.Base; } 
class EntityOne : EntityBase { EntityType = EntityType.One; } 
class EntityTwo : EntityBase { EntityType = EntityType.Two; } 

Я пытаюсь сопоставить коллекции EntityBase. Ошибка AutoMapper с ошибкой «Экземпляры абстрактных классов не могут быть созданы». У меня есть перечисление типа, и, следовательно, знаю, какой тип должен быть сопоставлен каждому ... но на самом деле просто хочу, чтобы все они были отображены в мою коллекцию EntityBase.

Я не могу понять это ...

У меня есть это работает, но это очень некрасиво.

Mapper.CreateMap<EntityCollectionDto, EntityCollection>().ForMember(
    s => s.Entities, d => d.MapFrom(
     x => new List<EntityBase>(
      from p in x.Entitys 
      select p.EntityType == EntityType.One ? Mapper.Map<EntityOne>(p) as EntityBase 
       : p.EntityType == EntityType.Two ? Mapper.Map<EntityTwo>(p) as EntityBase 
       : Mapper.Map<EntityThree>(p) as EntityBase 
      ) 
     ) 
    ); 

Mapper.CreateMap<EntityDto, EntityOne>(); 
Mapper.CreateMap<EntityDto, EntityTwo>(); 

ответ

2

Я не знаю, если вы, как это лучше, но при условии, классы сущностей следующим образом:

public abstract class EntityBase 
{ 
    public EntityType EntityType { get { return EntityType.Base; } } 
} 
public class EntityOne : EntityBase 
{ 
    public new EntityType EntityType { get { return EntityType.One; } } 
} 
public class EntityTwo : EntityBase 
{ 
    public new EntityType EntityType { get { return EntityType.Two; } } 
} 
public class EntityThree : EntityBase 
{ 
    public new EntityType EntityType { get { return EntityType.Three; } } 
} 
public class EntityCollection 
{ 
    public IList<EntityBase> Entities { get; set; } 
} 

public class EntityDto 
{ 
    public EntityType EntityType { get; set; } 
} 
public class EntityCollectionDto 
{ 
    public IList<EntityDto> Entities { get; set; } 
} 

Вы можете создать TypeConverter:

public class EntityTypeConverter : AutoMapper.TypeConverter<EntityDto, EntityBase> 
{ 
    protected override EntityBase ConvertCore(EntityDto source) 
    { 
     switch (source.EntityType) 
     { 
      case EntityType.One: 
       return AutoMapper.Mapper.Map<EntityOne>(source); 
      case EntityType.Two: 
       return AutoMapper.Mapper.Map<EntityTwo>(source); 
      default: 
       return AutoMapper.Mapper.Map<EntityThree>(source); 
     } 
    } 
} 

Это упростит ваше сопоставление до:

AutoMapper.Mapper.CreateMap<EntityDto, EntityBase>() 
    .ConvertUsing(new EntityTypeConverter()); 

AutoMapper.Mapper.CreateMap<EntityDto, EntityOne>(); 
AutoMapper.Mapper.CreateMap<EntityDto, EntityTwo>(); 
AutoMapper.Mapper.CreateMap<EntityDto, EntityThree>(); 

AutoMapper.Mapper.CreateMap<EntityCollectionDto, EntityCollection>(); 

AutoMapper.Mapper.AssertConfigurationIsValid(); 

Итак, у вас все еще есть конкретное сопоставление в TypeConverter (я не уверен, что есть способ избежать этого), но я думаю, что конечный результат немного чище.

+0

Согласен, я изучу его изменение. Благодарю. – CaffGeek

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