在AutoMapper 8.0中缺少ResolveUsing

Jua*_*ron 24 entity-framework automapper asp.net-core

在AutoMapper 8.0之前,我使用了以下代码:

CreateMap<ApplicationRole, RoleViewModel>()
.ForMember(d => d.Permissions, map => map.MapFrom(s => s.Claims))
.ForMember(d => d.UsersCount, map => map.ResolveUsing(s => s.Users?.Count ?? 0))
                    .ReverseMap();
Run Code Online (Sandbox Code Playgroud)

文档说你必须为MapFrom更改ResolveUsing,但我有一个错误"没有传播空"

.ForMember(d => d.UsersCount, map => map.MapFrom(s => s.Users?.Count ?? 0))
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Paw*_*sen 42

将ResolveUsing替换为MapFrom,并将另外一个输入参数添加到lambda(TDestination).

.ForMember(d => d.UsersCount, map => map.MapFrom((s,d) => s.Users?.Count ?? 0))
Run Code Online (Sandbox Code Playgroud)


Mar*_* R. 13

在AutoMapper 8.0中缺少ResolveUsing

我也有同样的问题,并且正在使用以下原型ResolveUsing

void ResolveUsing(Func<TSource, TResult> mappingFunction);
Run Code Online (Sandbox Code Playgroud)

我更喜欢创建一个扩展方法,而不是替换现有代码:

using System;
using AutoMapper;

namespace myLibrary.Extensions
{
    public static class AutoMapperCompatibilityExtensions
    {
        // Summary:
        //     Resolve destination member using a custom value resolver callback. Used instead
        //     of MapFrom when not simply redirecting a source member This method cannot be
        //     used in conjunction with LINQ query projection
        //
        // Parameters:
        //   resolver:
        //     Callback function to resolve against source type
        public static void ResolveUsing<TSource, TDestination, TMember, TResult>(this IMemberConfigurationExpression<TSource, TDestination, TMember> member, Func<TSource, TResult> resolver) => member.MapFrom((Func<TSource, TDestination, TResult>)((src, dest) => resolver(src)));
    }
}
Run Code Online (Sandbox Code Playgroud)

后来,在我的代码中,我只是引用了名称空间:

using myLibrary.Extensions;

...
    ... map.ResolveUsing(s =>  ...
...
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • 请原谅我,我能知道为什么我在这个答案上得到-1吗?谢谢。 (2认同)
  • 好吧,我只给了你+1,因为如果一个库不保持向后兼容性,那么自己做是完全合理的。 (2认同)