【问题标题】:Using AutoMapper 8 ProjectTo on DI instance在 DI 实例上使用 AutoMapper 8 ProjectTo
【发布时间】:2019-07-24 15:05:36
【问题描述】:

我正在使用AutoMapper.Extensions.Microsoft.DependencyInjection NuGet 包中提供的AddAutoMapper 方法将 AutoMapper 设置到 ASP.NET Core 2.2 Web 应用程序中。

将单个实体映射到模型并返回时效果很好 - 我可以毫无问题地做到这一点:

mapper.Map<Model>(context.Set<Entity>().First());

但我不知道如何让ProjectTo 工作。我正在注入 IMapper 并且我已经尝试了这两个:

mapper.ProjectTo<Model>(context.Set<Entity>());

context.Set<Entity>().ProjectTo<Model>(mapper.ConfigurationProvider);

无论哪种方式,我都会遇到相同的错误:

System.ArgumentException: Static method requires null instance, non-static method requires non-null instance.
   at System.Linq.Expressions.Expression.ValidateStaticOrInstanceMethod(Expression instance, MethodInfo method)
   at System.Linq.Expressions.Expression.ValidateMethodAndGetParameters(Expression instance, MethodInfo method)
   at System.Linq.Expressions.Expression.Call(MethodInfo method, Expression arg0)
   at AutoMapper.QueryableExtensions.Impl.MemberGetterExpressionResultConverter.ExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, MemberInfo getter) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\Impl\MemberGetterExpressionResultConverter.cs:line 24
   at System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func)
   at AutoMapper.QueryableExtensions.ExpressionBuilder.ResolveExpression(PropertyMap propertyMap, Type currentType, Expression instanceParameter, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 308
   at AutoMapper.QueryableExtensions.ExpressionBuilder.<>c__DisplayClass17_0.<CreateMemberBindings>g__CreateMemberBinding|0(PropertyMap propertyMap) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 272
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, IDictionary`2 typePairCount, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 266
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpressionCore(ExpressionRequest request, Expression instanceParameter, IDictionary`2 typePairCount, TypeMap typeMap, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 204
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary`2 typePairCount, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 152
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at AutoMapper.QueryableExtensions.ExpressionBuilder.GetMapExpression(Type sourceType, Type destinationType, Object parameters, MemberInfo[] membersToExpand) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 98
   at AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](Object parameters, Expression`1[] membersToExpand) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ProjectionExpression.cs:line 60
   at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Expression`1[] membersToExpand) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\Extensions.cs:line 76

我正在尝试按照此处文档中的说明使用它:

但看起来我在静态与实例设置方面做错了。我想使用我通过 DI 传入的 IMapper 实例,因为它在单个地图上运行良好。

我可以做些什么来修复这个错误?

【问题讨论】:

  • IMapper.ProjectTo 是您所需要的。但似乎你发现了一个错误。复制会有所帮助。创建一个gist,我们可以执行并看到失败。但请确保您尝试使用 ProjectTo 来实现。

标签: asp.net-core dependency-injection automapper


【解决方案1】:

我找到了这个错误的原因。感谢Lucian Bargaoanu关于有限supported mapping options的提醒。我使用flattening 和源类型上以“Get”为前缀的方法,但我认为这不适用于ProjectTo。 (我认为这属于列表中的最后一项 - 域对象上的任何计算属性。)这就是 LINQ 给出错误“非静态方法需要非空实例”的原因。

【讨论】:

    【解决方案2】:

    不确定这是否会帮助任何人,但不要忘记检查您的反向映射是否也符合 AutoMapper 支持的选项。

    我刚刚花了一个小时在试错尝试解决这个问题。最后我注意到/记得我在所有映射的末尾都有ReverseMap(),这意味着当映射被反转时,大量的源到目标的映射规则被违反了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多