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))
就可以神奇地修复所有问题。
问题:
- 为什么?我认为这与 RedisValue 的实现方式有关,但我真的不明白为什么它在带有 AutoMapper 11 的 .Net 6 中停止工作。
- 要映射所有具有字符串类型的成员,我们使用
.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
,顾名思义,将覆盖您的自定义配置。
只是不要那样写代码。
我在将 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))
就可以神奇地修复所有问题。
问题:
- 为什么?我认为这与 RedisValue 的实现方式有关,但我真的不明白为什么它在带有 AutoMapper 11 的 .Net 6 中停止工作。
- 要映射所有具有字符串类型的成员,我们使用
.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
,顾名思义,将覆盖您的自定义配置。
只是不要那样写代码。