Automapper:我需要打电话给#34; CreateMap"每个实体副本 - DTO?

时间:2018-02-23 17:05:22

标签: c# automapper automapper-6

我使用Automapper(6.2.1)转换实体对象的层次结构:

class Entity1 {}
class Entity2 : Entity1 {}
class Entity3 : Entity1 {}

到DTO对象的相应层次结构:

class EntityDTO1 {}
class EntityDTO2 : EntityDTO1 {}
class EntityDTO3 : EntityDTO1 {}

我已经映射了所有这些转换:

 CreateMap<Entity1, EntityDTO1>();
 CreateMap<Entity2, EntityDTO2>();
 CreateMap<Entity3, EntityDTO3>();

每次创建一个实体和一个DTO时,我都需要在配置文件中添加一个新的CreateMap调用。

这样做的方法还不紧凑吗?

1 个答案:

答案 0 :(得分:2)

如果您使用名称约定,您可以执行以下操作:

 AutoMapper.Mapper.Initialize(map =>
            {
                var asmEntities = Assembly.Load("DomainLibrary");
                var asmDtos = Assembly.Load("ViewModelsLibrary");

                foreach (Type entity in asmEntities.GetTypes())
                {
                    var vm = asmDtos.GetTypes().FirstOrDefault(x => x.Name == $"{entity.Name}Vm");
                    if (vm != null)
                    {
                        map.CreateMap(entity, vm).ReverseMap();
                    }
                }
}

  //  exemple names: 

Entity = Product
ViewModel = ProductVm

这是我用来使实体动态化的方法:

 public static object GetEntity(object model)
        {
            var map = AutoMapper.Mapper
                .Configuration
                .GetAllTypeMaps()
                .FirstOrDefault(x => x.SourceType == model.GetType());

            if (map == null) return null;

            return AutoMapper.Mapper
                .Map(model, model.GetType(), map.DestinationType);

        }