我在实现自动映射转换时遇到问题,在这种情况下,源是一个类,应根据源上的值映射到两个派生类之一。
这是我课程的简化:
public class FooContainerDTO
{
public FooDTO Foo { get; set; }
}
public class FooDTO
{
public string Type { get; set; }
//some properties..
}
public class FooContainer
{
public FooBase Foo { get; set; }
}
public abastract class FooBase
{
//some properties..
}
public class FooDerived1 : FooBase
{
//some properties
}
public class FooDerived2 : FooBase
{
//some properties
}
我正在使用非静态Automapper,所以我在启动时从几个Profiles创建一个MapperConfiguration,并将IMapper实例注入我的DI容器。 我希望Automapper在其Type属性为“der1”时将FooDTO映射到FooDerived1,当它是“der2”时将其映射到FooDerived2。
我在静态api上看过这样的例子,如下所示:
Mapper.CreateMap<FooContainerDTO, FooContainer>();
//ForMember configurations etc.
Mapper.CreateMap<FooDTO, FooDerived1>();
//ForMember configurations etc.
Mapper.CreateMap<FooDTO, FooDerived2>();
//ForMember configurations etc.
Mapper.CreateMap<FooDTO, FooBase>()
.ConvertUsing(dto => dto.Type == "der1"
? (FooBase) Mapper.Map<FooDerived1>(dto)
: Mapper.Map<FooDerived2>(dto));
这会将FooContainer的Foo属性映射到正确的FooBase派生类型。
但是如果没有静态API,我怎么能这样做呢? 在配置配置文件时尚未创建IMapper实例。 有没有办法利用ConvertUsing()的重载,它接受一个Func&lt; ResolutionContext,object&gt;?分辨率上下文能否给我提供目前正在使用的IMapper?我一直在寻找,但找不到任何可用的东西。
答案 0 :(得分:2)
访问映射引擎的一种方法是通过您自己的TypeConverter
abstract class MyTypeConverter<TSource,TDestination> : ITypeConverter<TSource, TDestination>
{
protected ResolutionContext context;
public TDestination Convert(ResolutionContext context)
{
this.context = context;
return Convert((TSource)context.SourceValue);
}
public abstract TDestination Convert(TSource source);
}
然后创建一个实际的实现,如:
class MyTypeMapper : MyTypeConverter<EnumType,EnumTypeView>
{
public override EnumTypeView Convert(EnumType source)
{
return context.Engine.Mapper.Map<EnumTypeID, EnumTypeView>(source.EnumBaseType);
}
}
除了展开枚举结构外,您不需要检查类型并使用不同类型调用Map。