Automapper嵌套映射在孩子中共享父母信息

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

跟进this答案时我遇到了错误。 我有三个课程,以及它们各自的 DTO:

public class ClassA
{
    public string Name { get; set; }
    public List<ClassB> Children { get; set; }
}

public class ClassB
{
    public int Type { get; set; }
    public ClassC Value { get; set; }
}

public class ClassC
{
    public string Name { get; set; }
}

public class ClassADto
{
    public string Name { get; set; }
    public List<ClassB> Children { get; set; }
}

public class ClassBDto
{
    public int Type { get; set; }
    public ClassC Value { get; set; }
}

public class ClassCDto
{
    public string Name { get; set; }
}

我有以下映射配置:

public class MyProfile : Profile
{
    // the converter is registered in ServiceCollection
    public MyProfile(IValueConverter<string, string> valueConverter)
    {
        this.CreateMap<ClassA, ClassADto>().ReverseMap();

        this.CreateMap<ClassB, ClassBDto>()
            .BeforeMap((source, destination, context) =>
             {
               if (context.TryGetItems(out var items))
                 {
                    items["ClassBDto"] = source;
                 }
             })
            .ReverseMap();

        this.CreateMap<ClassC, ClassCDto>();

        this.CreateMap<ClassCDto, ClassC>()
            .ForMember(field => field.Name, opt => opt.ConvertUsing(valueConverter));

    }
}

转换器本身:

public class MyValueConverter : IValueConverter<string, string>
{
    public string Convert(string sourceMember, ResolutionContext context)
    {
        var retVal = sourceMember;
        if ((ClassBDto)(context.Items["ClassBDto"]).Type == 1) retVal += "Type is 1";
        return retVal;
    }
}

但是当运行映射并检查ResolutionContext时,我收到错误:

Context.Items are only available when using a Map overload that takes Action<IMappingOperationOptions>! Consider using Context.TryGetItems instead.

当我在

var retVal = sourceMember;
上放置断点并观察
ResolutionContext context
变量时,我观察到了此错误;

This is the screenshot of the observation

有人可以告诉我我做错了什么吗?

致以诚挚的问候

c# asp.net .net automapper
1个回答
0
投票

根据文档所述,从版本 12 开始,它限制了

Context.Items
的访问。

此外,只有在将地图调用为

文档
时,才可以向Context.Options提供附加值。

我不明白你为什么要让它变得复杂,你可以使用

.ForPath
将值从父字段传递并分配给子字段,如下所示:

this.CreateMap<ClassB, ClassBDto>();
        
this.CreateMap<ClassBDto, ClassB>()
    .ForPath(
        dest => dest.Value.Name, 
        opt => opt.MapFrom(src => src.Value.Name + (src.Type == 1 ? "Type is 1": ""))
    );
© www.soinside.com 2019 - 2024. All rights reserved.