两个之间的 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;
}
}
我知道这是一个简单的问题,解决方案应该也很简单,但我脑袋放屁,需要一些帮助
我认为只要有可能,最好避免必须手动指定属性之间的映射。我不确定你的情况是否有充分的理由为什么它是 AProductKey
和 BProductKey
而不是简单地 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; }
}
所以这个问题在这里被问了一千次,但到目前为止没有任何帮助。
问题:
我有一个 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;
}
}
我知道这是一个简单的问题,解决方案应该也很简单,但我脑袋放屁,需要一些帮助
我认为只要有可能,最好避免必须手动指定属性之间的映射。我不确定你的情况是否有充分的理由为什么它是 AProductKey
和 BProductKey
而不是简单地 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; }
}