我使用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
调用。
这样做的方法还不紧凑吗?
答案 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);
}