繁体   English   中英

可更换的第三方服务

[英]Replaceable 3rd party services

我们正在重构和升级严重依赖第三方集成服务的系统。 问题在于,客户端非常频繁地更改服务提供商,例如从一个SMS服务提供商更改为另一个。 每个提供程序都有不同的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");

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM