我们正在重构和升级严重依赖第三方集成服务的系统。问题在于,客户端非常频繁地更改服务提供商,例如从一个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");
实施这种方法的正确方法是什么?
答案 0 :(得分:0)
声明字段_smsService
的类型应为声明接口的类型:ISmsService
,通过使用依赖注入进行实例化,可以使生活更轻松。
然后,调用者总是调用this._smsService.Send("123456789", "Hello");
所有必需的参数必须由适当的实现加载,以便从配置中在构造函数内部进行检查。这样,每个包装器都具有具有相同签名的Send
方法,并且所有提供程序特定的参数都对调用方隐藏。