首页 > 解决方案 > 使用 Automapper 的 IValueConverter 的问题

问题描述

我对如何实现映射有点迷茫。我会试着描述一下情况。我正在从 ParcelRequestDTO 映射到 NParcel。这是两个类:

public class ParcelRequestDTO
{
    public decimal Length { get; set; }
    public decimal Width { get; set; }
    public decimal Height { get; set; }
    public string DistanceUnit { get; set; }
    public decimal Weight { get; set; }
    public string MassUnit { get; set; }
    public string Metadata { get; set; }
}

public partial class NParcel
{
    public int Id { get; set; }
    public decimal? Length { get; set; }
    public decimal? Width { get; set; }
    public decimal? Height { get; set; }
    public int? DistanceUnitId { get; set; }
    public decimal Weight { get; set; }
    public int? MassUnitId { get; set; }
}

NParcel 实际上是 EF 实体的一部分。DistanceUnitId 和 MassUnitId 是外键,因此它们的值可以为 null 或必须是对主键的引用。

因此,在我的 DTO 中,我将 MassUnit 作为字符串接收,例如“lb”、“oz”、“gr”、“K”等。我需要在适当的表中为任何这些标签找到相应的 id。所以我正在尝试实现一个值转换器:

public class ResolveMassUnits : IValueConverter<string, int>
{
    private readonly IMassUnitsService _massUnitsService;
    public ResolveMassUnits(IMassUnitsService massUnitsService)
    {
        _massUnitsService = massUnitsService;
    }

    public int Convert(string sourceMember, ResolutionContext context)
    {
        int? retVal = _massUnitsService.GetIdByName(sourceMember);
        if (retVal == null)
        {
            retVal = _massUnitsService.GetIdByName("lb");
        }
        return (int)retVal;
    }
}

如您所见,我正在尝试注入(.NET Core 3 依赖注入模型)来实例化 ResolveMassUnits 类(我不确定我这样做是否正确,所以如果您在这里看到问题,请提出建议)。

但是,我最初的问题是,当我尝试设置映射时,出现编译错误。这就是我正在做的事情:

public class RequestsProfile : Profile
{
    public RequestsProfile()
    {

       CreateMap<ParcelRequestDTO, NParcel>()
            .ForMember(dest => dest.ParcelState, opt => opt.Ignore())
            .ForMember(dest => dest.DistanceUnit, opt => opt.Ignore())
            .ForMember(dest => dest.MassUnitId, opt => opt.ConvertUsing<ResolveMassUnits, string>(src => src.MassUnit))
            .ForMember(dest => dest.ParcelTemplate, opt => opt.Ignore())
            ;
   }  
}

当我编译时,我得到这些错误:

严重性代码描述项目文件行抑制状态错误 CS0311 类型“Test.API.Mappings.ResolveMassUnits”不能用作泛型类型或方法“IMemberConfigurationExpression<ParcelRequestDTO, NParcel, object>.ConvertUsing<TValueConverter, TSourceMember>(表达式<Func<ParcelRequestDTO, TSourceMember>>)'。没有从“Test.API.Mappings.ResolveMassUnits”到“AutoMapper.IValueConverter<string, object>”的隐式引用转换。Test.API C:\Projects\Test\Repo\src\IO.Swagger\Mappings\RequestsProfile.cs 146 活动错误 CS0246 找不到类型或命名空间名称“ResolveMassUnits”(您是否缺少 using 指令或程序集引用?) CoreAPIServiceTesting C:

所以很明显它没有找到 ResolveMassUnits。

有人知道我做错了什么吗?我试图以几种不同的方式解决这个问题,但为了我,我找不到正确进行此映射的方法。

提前致谢。

标签: automapperasp.net-core-3.1

解决方案


初始化 Automapper 时,使用以下命令指定您的服务容器:

Mapper.Initialize(map =>
{
    map.ConstructServicesUsing(ObjectFactory.GetInstance);
});

推荐阅读