两个之间的 DTO 类

DTO Between two Classes

所以这个问题在这里被问了一千次,但到目前为止没有任何帮助。

问题:

我有一个 class 从我的控制器接收数据,将此数据传输到 API 并获得结果。 到目前为止它有效。

但现在我卡住了,因为我必须做这样的事情

Controller --> ARequestClass --> BRequestClass-->CientClass接收数据--> ClientClass响应数据-->BResultClass-->AResultClass-->Controller

控制器和 ARequestClass 之间的连接有效。 BRequestClass 和 ClienClasst 之间的连接有效

但是我怎么能说 属性 来自 ArequestClass 属于 BRequestClass

我尝试了 AutoMapper 并观看和阅读了 DTO 内容的音调,但所有这些都帮不了我:|

看起来像这样

public class ARequest
{
    public string AText { get; set; }
    public string AProductKey { get; set; }
    public string ASettings { get; set; }
}
public class BRequest
{
    public string BText { get; set; }
    public string BProductKey { get; set; }
    public string BSettings { get; set; }
}
public class ClientClass
{
    public BResult DoSomething(BRequest request)
    {
        client.something = $"www.anRandomApi.com/{request.BText}{request.BProductKey}{request.BSettings};
        return client;
    }
}

我知道这是一个简单的问题,解决方案应该也很简单,但我脑袋放屁,需要一些帮助

我认为只要有可能,最好避免必须手动指定属性之间的映射。我不确定你的情况是否有充分的理由为什么它是 AProductKeyBProductKey 而不是简单地 ProductKey 两者(AutoMapper 会自动为你处理)。 如果问题与序列化有关,在您的 类 中更好的方法可能是使用 JsonProperty 属性从 JSON 对象映射到在 C# 中更易于维护 属性。

无论如何,您可以使用 AutoMapper 指定特定属性的映射(推荐方式):

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<ARequest, BRequest>()
        .ForMember(dest => dest.BText, o => o.MapFrom(src => src.AText))
        .ForMember(d => d.BProductKey, o => o.MapFrom(s => s.AProductKey))
        .ForMember(d => d.BSettings, o => o.MapFrom(s => s.ASettings));
});

或者,如果您想要更危险的选项来避免单独映射每个 属性(我会在生产代码中避免这种情况):

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<ARequest, BRequest>()
        .ForAllMembers(mo =>
        {
            var convertedName = mo.DestinationMember.Name;
            if (convertedName.StartsWith("B"))
            {
                convertedName = "A" + convertedName.Substring(1);
            }
            mo.MapFrom(convertedName);
        });
});

或者,您可以在没有 AutoMapper 的情况下通过向接受 ARequest 的 BRequest 添加构造函数来执行此操作:

public class BRequest
{
    public BRequest() { }

    public BRequest(ARequest source)
    {
        this.BText = source.AText;
        this.BProductKey = source.AProductKey;
        this.BSettings = source.ASettings;
    }

    public string BText { get; set; }
    public string BProductKey { get; set; }
    public string BSettings { get; set; }
}