【发布时间】: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 应该首先阅读他们的帮助中心。