我们有一个集成系统。我们正在将API返回的一个对象转换/映射到另一个不同的对象,以便在另一个完全独立的API的POST请求中使用。现在,一切都在一个巨大的功能中完成,使得调试非常耗时。
但是,它并不像使用AutoMapper或简单的自定义映射类那么简单。转换需要在其间进行大量调用。简化版例如: 假设以下是在url(http://example.com/getCustomer)
处通过GET API调用返回的JSON{
id:1,
addressId:42
countryid:333,
stateId:666
}
现在,我们想将此转换为另一个可以在POST请求调用中发送到另一个API的对象(http://foo.org/createPatron)
{
name:ABC,
address:123 Random Street
country:Canada
state:Ontario
customerSince: 4/8/2018
customerType: VIP
}
因此,除了构建正确类型的对象之外,这种转换还需要许多其他API调用。
现在,我处于这种转换责任所在的两难境地。 我有一个来自一个电话的POCO和来自另一个电话的POCO。这里有设计模式吗?是否应该将api调用者对象传递给POCO,以便可以从中调用API调用?
**
考虑这种方式:我有这个DTO
// assume getters and setters
class UserDTO {
long id;
int countryCode;
int stateCode;
}
现在我想将其转换为以下实体
// assume getters and setters
class User {
long id;
string countryName;
string stateName;
}
但是,要将 UserDTO 中的 countryCode 转换为用户中的 countryName ,需要拨打电话获取所有国家/地区代码到countryName映射,例如:http://example.org/getCountryList。获取此列表后,我必须在DTO中找到包含代码的国家/地区名称。然后必须为状态做同样的事情。
您可以使用众多其他属性对此进行成像。其中一些可能需要在用户分配之前进行一些验证和组合。
所以我依赖其他数据源将 UserDTO 转换为 User 。同样,这个责任应该在哪里处理?类似的一种方式(注意我们可以使用构造函数,但这不是重点):
// assume getters and setters
class User {
long id;
string countryName;
string stateName;
public UserDTO FromUserDTO(ApiCaller apiCallerm,UserDTO userDTO){
var countries = apiCaller.GetCountryList();
this.countryName = countries.First(c => c.countryCode.Equals(userDTO.countryCode));
.
.
.
现在的问题是ApiCaller正在传递给Entity,或者它可以传递给DTO,这将违反单一责任原则。
所以我的问题再次出现:应该在哪里进行转换责任?