2

我刚刚尝试将 AutoMapper 升级到 5.0.2,但遇到了障碍。

根据迁移文档,值解析器现在可以访问目标对象:

值解析器的签名已更改,以允许访问源/目标模型。

这导致每个值解析器都与一个目标类型绑定。

但是,我们的一些值解析器用于多种目标类型。例如,我们有一个解析器,用于映射我们 DTO 的所有 ID 属性。解析器通过注入解析器的服务来修改 ID。

如何在 AutoMapper 5 中定义可重用的值解析器,这样我就不必为每个目标类型创建具有完全相同实现的专用解析器?

注意:使用值解析器而不是直接操作值的主要原因是依赖注入。根据这个答案,值解析器是在映射期间使用依赖注入服务的最佳方式。

4

2 回答 2

5

目标类型可以只是“对象”:

public class FooResolver : IValueResolver<object, object, string> {}

或者它可以更具体:

public class FooResolver : IValueResolver<IEntity, object, string> {}

由于为 IValueResolver 定义的差异,您可以将基类型放在前两个通用参数中。

于 2016-07-13T16:37:24.803 回答
-1

美好的一天,我认为最好的方法是使用泛型如下:

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

于 2019-10-03T14:10:46.837 回答