2

我正在使用 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向我的配置文件添加一个新调用。

没有更紧凑的方法可以做到这一点?

4

1 回答 1

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);

        }
于 2018-02-23T17:19:44.553 回答