Automapper:将 RedisValue 从 StackExchange.Redis StreamEntry 映射到对象奇怪的行为

Automapper: mapping RedisValue from StackExchange.Redis StreamEntry to an object strange behavior

我在将 StreamEntry 从 StackExchange.Redis 库映射到 C# 记录时遇到了一些 st运行ge 行为。虽然我找到了编写映射以使其工作的方法,但我仍然不明白,为什么它只能以这种方式工作(可能是由于对 AutoMapper 内部知识的了解有限)。另外,我认为这可以作为任何遇到此问题的人的一个例子。

简介: 我正在使用 StackExchange.Redis & AutoMapper 将 .Net 5 项目迁移到 .Net 6,同时更新所有使用的包。 Automapper 成为版本 11 和 StackExchange.Redis 版本 2.2.88。 当我 运行 我们的单元测试时,映射验证突然失败。我在映射方面没有做太多更改,仅将 ForAllOtherMembers 替换为 ForAllMembers,这对我来说非常难运行ge。

问题本身: .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) 如果 src 对象是 StreamEntry,则指令无效。它只是抛出错误“错误映射类型”。在验证时就像没有映射一样!

解决方法: 经过一些尝试,我设法发现您不应该使用 MapFrom<TSourceMember>(Expression<Func<TSource, TSourceMember>> mapExpression),而应该使用 MapFrom<TResult>(Func<TSource, TDestination, TResult> mappingFunction),并且一切正常。所以只需将上面的代码行更改为 .ForMember(dest => dest.Id, opt => opt.MapFrom((src, _) => src.Id)) 就可以神奇地修复所有问题。

问题:

  1. 为什么?我认为这与 RedisValue 的实现方式有关,但我真的不明白为什么它在带有 AutoMapper 11 的 .Net 6 中停止工作。
  2. 要映射所有具有字符串类型的成员,我们使用 .ForAllMembers(opt => opt.MapFrom(src => src[opt.DestinationMember.Name])) 并且它仍然可以正常工作,但是如果您尝试将其替换为 .ForAllMembers(opt => opt.MapFrom((src, _) => src[opt.DestinationMember.Name])),它将中断。

.Net 6 控制台示例显示了问题和正确的映射方式可以找到 here。 TLDR:配置 A 和 C 无效,B 应该如何完成。

这些是使用错误。 ForAllMembers,顾名思义,将覆盖您的自定义配置。 只是不要那样写代码。