我刚刚尝试将自动映射器升级到5.0.2,但遇到了障碍。
根据迁移文档,值解析程序现在可以访问目标对象:
值解析程序的签名已更改,以允许访问源/目标模型。
这会导致每个值解析程序只绑定到一个目标类型。
但是,我们的一些价值解析器用于多种目标类型。例如,我们有一个解析器,用于映射 DTO 的所有 ID 属性。解析程序通过注入到解析程序中的服务来修改 ID。
如何在 AutoMapper 5 中定义可重用的值解析器,以便不必为具有完全相同实现的每个目标类型创建专用解析器?
注意:使用值解析器而不是直接操作值的主要原因是依赖注入。根据此答案,值解析器是在映射期间使用依赖关系注入服务的最佳方式。
目标类型只能是"对象":
public class FooResolver : IValueResolver<object, object, string> {}
或者它可以更具体:
public class FooResolver : IValueResolver<IEntity, object, string> {}
由于为 IValue 解析程序定义了方差,因此可以将基类型放在前两个泛型参数中。
美好的一天,我认为最好的方法是按如下方式使用泛型:
public class FooResolver<TSource, TDestination> : IValueResolver<TSource, TDestination, string>
{
private readonly Dictionary<Type, int> typeDictionary;
public FooResolver()
{
typeDictionary = new Dictionary<Type, int>
{
{typeof(FooA), 0},
{typeof(FooB), 1}
};
}
pulic string Resolve(TSource source, TDestination destination, string destMember,
ResolutionContext context)
{
switch (typeDictionary[source.GetType()])
{
case 0:
var fooA = ((FooA)Convert.ChangeType(source, typeof(FooA)));
//custom code
break;
case 1:
var fooB = ((FooB)Convert.ChangeType(source, typeof(FooB)));
//custom code
break;
}
return string_value;
}
}
在映射过程中,您只需提供源和目标的实际类型,例如 act.MapFrom<FooResolver<FooA, FooADestination>>