【问题标题】:AutoMapper and Base TypesAutoMapper 和基本类型
【发布时间】:2013-04-05 02:13:44
【问题描述】:

我有一个 EntityDtos 集合。

每个 EntityDto 都有一个名为 EntityType 的属性。

每个实体类型对应一个不同的子类,像这样

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

我正在尝试映射到 EntityBase 的集合。 AutoMapper 失败并出现错误“无法创建抽象类的实例”。我有 Type 枚举,因此知道每个应该映射到什么类型...但实际上,只是希望它们都映射到我的 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>();

【问题讨论】:

    标签: abstract-class automapper


    【解决方案1】:

    我不知道你是否会更喜欢这个,但假设实体类如下:

    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 中仍然有特定的映射(我不确定有没有办法避免这种情况),但我认为最终结果更清晰一些。

    【讨论】:

    • 同意,我会考虑改变它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 2013-05-13
    • 2014-12-17
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多