我正在使用 Automapper 将我的域模型( nHibernate )映射到我的视图模型并返回。 一切都很顺利。
现在我需要将实体(域实体)映射到自身,因为我想在那里定义一些业务规则。
我需要多次为同一类型定义不同的映射。 我已经为每种类型的映射使用了配置文件:
public static void Configure()
{
Mapper.Initialize(a =>
{
Mapper.AddProfile(new OrderViewModelMapperProfile());
Mapper.AddProfile(new OrderToOrder1MapperProfile());
Mapper.AddProfile(new OrderToOrder2MapperProfile());
});
}
这是我的个人资料(简化):
public class OrderToOrder1MapperProfile : Profile
{
protected override void Configure()
{
this.CreateMap<Domain.Order, Domain.Order>()
.WithProfile("Profile001")
.ForMember(dest => dest.Code, opt => opt.MapFrom(source => System.Guid.Empty))
.ForMember(dest => dest.OrderLines, opt => opt.Ignore())
.AfterMap((source, destination) =>
{
foreach (var line in source.OrderLines)
{
destination.AddOrderLine(Mapper.Map<Domain.OrderLine, Domain.OrderLine>(line));
}
});
this.CreateMap<Domain.OrderLine, Domain.OrderLine>()
.ForMember(dest => dest.Order, opt => opt.Ignore())
.ForMember(dest => dest.Code, opt => opt.MapFrom(source => System.Guid.Empty));
}
}
如您所见,我需要在 AfterMap 中做一些事情。
我的第二个个人资料 OrderToOrder2MapperProfile 看起来类似于此处显示的一个,所以我不会粘贴代码。
当我映射我的对象时:
Domain.Order order = new Domain.Order();
var order2 = Mapper.Map<Domain.Order, Domain.Order>(order);
处理两个配置文件。
我决定按照suggested的路径进行操作,并且我已经创建了我的&#34; custom&#34;发动机:
private IMappingEngine CustomMappingEngine()
{
ConfigurationStore store = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
MappingEngine engine = new MappingEngine(store);
store.AddProfile(new OrderToOrder2MapperProfile());
store.AllowNullDestinationValues = true;
store.AssertConfigurationIsValid();
return (engine);
}
现在一切正常,除了线的映射;即使我使用自定义引擎映射我的对象,也会处理这两个管道:
Domain.Order order = new Domain.Order();
var newEngine = CustomMappingEngine();
var order2 = newEngine.Map<Domain.Order, Domain.Order>(order);
我想问题在于我在这里使用单身 Mapper (引擎):
destination.AddOrderLine(Mapper.Map<Domain.OrderLine, Domain.OrderLine>(line))
我试图找到一种在分析器中使用当前引擎的方法,但我似乎无法以任何方式获取它。
唯一可行的解决方案是在我的探查器的构造函数中传递引擎:
public class OrderToOrder2MapperProfile : Profile
{
private readonly IMappingEngine CurrentMappingEngine = null;
public OrderToOrder2MapperProfile(IMappingEngine mappingEngine)
{
this.CurrentMappingEngine = mappingEngine;
}
protected override void Configure()
{
this.CreateMap<Domain.Order, Domain.Order>()
.WithProfile("Profile002")
.ForMember(dest => dest.Code, opt => opt.MapFrom(source => System.Guid.Empty))
.ForMember(dest => dest.OrderLines, opt => opt.Ignore())
.AfterMap((source, destination) =>
{
foreach (var line in source.OrderLines)
{
destination.AddOrderLine(this.CurrentMappingEngine.Map<Domain.OrderLine, Domain.OrderLine>(line));
}
});
this.CreateMap<Domain.OrderLine, Domain.OrderLine>()
.ForMember(dest => dest.Order, opt => opt.Ignore())
.ForMember(dest => dest.Code, opt => opt.MapFrom(source => System.Guid.Empty));
}
}
在这里使用当前的引擎:
destination.AddOrderLine(this.CurrentMappingEngine.Map<Domain.OrderLine, Domain.OrderLine>(line));
问题:
这是唯一可行的解决方案还是有更好的选择? 我是以正确的方式做事吗?
如果有人感兴趣我已经创建了一个github repository,它使用 StructureMap 作为测试用例。