Automapper 12.x 将 Guid 映射到字符串

问题描述 投票:0回答:1

在 Automapper 11.x 中,我有一个从 Guid 到 String 的映射,如下所示:

CreateMap<CreateClientRequest, Client>(MemberList.Source)
    .ForMember(dest => dest.Id, opt => opt.Ignore())
    .ForMember(dest => dest.ClientId, opt => opt.MapFrom(src => src.ClientId.ToString())); // Guid to String

当我像这样运行单元测试时:

_configuration.AssertConfigurationIsValid();

一切正常。现在我已将 Automapper 升级到 12.x,验证失败并显示消息:

发现未映射的成员。查看下面的类型和成员。 添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型 对于没有匹配的构造函数,请添加无参数构造函数、添加可选参数或映射所有构造函数参数 =================================================== =================================================== =============== CreateClientRequest -> Client(源成员列表) Requests.CreateClientRequest -> Entities.Client(源成员列表)

未映射的属性: 客户ID

现在应该如何进行映射才能使映射正确并且验证成功?我试图查看文档以了解如何操作。但我没有找到任何相关信息。谢谢你

c# automapper .net-8.0
1个回答
2
投票

Automapper 知道如何将

Guid
转换为
string
,因此您只需删除
ToString()
(因为未应用自定义格式):

e.CreateMap<CreateClientRequest, Client>(MemberList.Source)
    .ForMember(dest => dest.Id, opt => opt.Ignore())
    .ForMember(dest => dest.ClientId, opt => opt.MapFrom(s => s.ClientId));

一切都会顺利。

第10版升级指南有以下内容

来源验证

仅考虑简单的源成员表达式,

MapFrom(d => d.Member, s => s.SourceMember)

但是我希望你的原始代码在第 11 版中也会失败。

如果您需要定义自定义转换,那么您可以使用

ConvertUsing
:

e.CreateMap<CreateClientRequest, Client>(MemberList.Source)
    .ForMember(dest => dest.Id, opt => opt.Ignore())
    .ForMember(dest => dest.ClientId, opt => opt.ConvertUsing(ValConverter.Instance, r => r.ClientId));

public class ValConverter : IValueConverter<Guid, string>
{
    public static ValConverter Instance { get; } = new();
    public string Convert(Guid sourceMember, ResolutionContext context) => sourceMember.ToString("B");
}

另请参阅 此 github 问题

© www.soinside.com 2019 - 2024. All rights reserved.