可更换的第三方服务

时间:2019-07-02 07:59:57

标签: c# .net

我们正在重构和升级严重依赖第三方集成服务的系统。问题在于,客户端非常频繁地更改服务提供商,例如从一个SMS服务提供商更改为另一个。每个提供程序都有不同的API,这些API具有不同的参数和方法,什么是使切换更轻松的最佳方法?

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

我们还试图使所有方法接收一个参数-一个实现接口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");

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

1 个答案:

答案 0 :(得分:0)

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

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

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