【问题标题】:Replaceable 3rd party services可替换的第三方服务
【发布时间】:2019-07-02 16:29:57
【问题描述】:

我们正在重构和升级一个严重依赖第三方集成服务的系统。问题是客户端经常更换服务提供商,例如从一个 SMS 服务提供商切换到另一个。每个提供者都有不同的 API,具有不同的参数和方法,什么是让切换不那么痛苦的最佳方法?

我们已经尝试为所有 3rd 方服务创建一个统一的接口,它允许预定义一组每个 3rd 方服务包装器应该实现的方法,但问题是不同的服务有不同的参数和返回值。

我们还尝试让所有方法都接收一个参数 - 一个实现接口 IArgs 的类,然后是一个实现 ISmsService 的附加适配器类,该类将 args 转换为所需的类型并将其传递给服务包装类.但是开销太大,因为您需要为每个方法创建一个 args 类。


// common interface
public interface ISmsService 
{
   Task<int> Send(string phoneNumber, string text);
}

//external rest service1 wrapper class
public class SmsService1 : ISmsService
{
   public int Send(string text, string phoneNumber)
   {
      //call rest endpoint here
   }
}

// external rest service 2 wrapper class
public class SmsService2
{
   public string Send(int clientId, string countryCode, string phoneNumber, string text)
   {
      //call rest endpoint here
   }
}


//actual service call
this._smsService.Send("123456789", "Hello");

//switch to
this._smsService.Send(12, "21", "123456789", "Hello");

实施这种方法的正确方法是什么?

【问题讨论】:

  • 尝试在codereview.stackexchange.com 上提问。在那里你可能会更快地得到答案。
  • 我是否正确理解调用者传递的所有相关数据都是接收者编号和文本,而其他所有内容都特定于提供者?在这种情况下,你有你的接口和其他一切(所有提供者特定的参数都受包装器的约束,恕我直言不应该从调用者传递)。
  • 这只是一个例子(也许不是最好的)。在其他外部服务中,同一个动作的参数可能完全不同,这是最大的问题
  • @Matt 不。我会在那里结束这个问题。
  • @Matt 在代码审查中提出了同样的问题,并被 OP 删除(否则它将作为示例代码关闭)。 IMO 很适合这个问题是 softwareengineering.stackexchange.com 但 OP 应该首先阅读他们的帮助中心。

标签: c# .net


【解决方案1】:

声明的字段_smsService 应该是您声明的接口类型:ISmsService,您可以通过使用依赖注入进行实例化让您的生活更轻松。

然后调用者总是调用this._smsService.Send("123456789", "Hello");

所有必需的参数必须由适当的实现加载,例如在构造函数中从配置中加载。这样每个包装器都具有具有相同签名的Send 方法,并且所有提供程序特定的参数都对调用者隐藏。

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2012-06-08
    • 2017-02-05
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多