需要调用数据库

时间:2018-04-08 23:56:24

标签: c# asp.net design-patterns mapping refactoring

我们有一个集成系统。我们正在将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调用?

**

编辑1:更多地以另一种方式扩展问题。

考虑这种方式:我有这个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,这将违反单一责任原则。

所以我的问题再次出现:应该在哪里进行转换责任?

0 个答案:

没有答案