用于多个支付网关的最佳模式
Posted
技术标签:
【中文标题】用于多个支付网关的最佳模式【英文标题】:Best pattern to be used for multiple payment gateways 【发布时间】:2015-09-06 11:01:04 【问题描述】:要求:
我需要与多个支付网关集成。但是,客户端仅使用其中一种可用的,并且使用管理员设置进行配置。
当前系统:
我为每个支付网关编写了一个库。随着网关集成请求(源)的增加,这会造成维护噩梦和项目的潜在增加。
问题
有人可以建议我在这种情况下使用的设计模式,可以创建接口和通用设置并根据需要实现网关以减少重复代码吗?
【问题讨论】:
在我看来你已经回答了你自己的问题 我会去看看 NopCommerce 之类的公司是如何做到的。如果我没记错的话,他们每个提供商都有一个插件,而且几乎可以肯定至少有一个界面在使用。 策略设计模式怎么样? 如果您有一些代码在您的各种支付项目库中重复出现,那么创建另一个项目,您可以在其中定义一个抽象支付类,所有其他支付提供商都从该类派生。因此,现在跨多个项目的所有通用代码都在一个抽象类中,并且更易于维护。 【参考方案1】:我会创建一个标准接口来处理常见的操作。拥有一组传递给这些方法的域对象。
例如,要创建付款,您可能有一个 PaymentCardDetails 模型、一个 AddressModel 等。您的接口将有一个 MakePayment 或类似方法,例如:
public MakePaymentResponse MakePayment(PaymentCardDetails cardDetails, AddressModel address);
那么您的每个支付网关都应该使用自己的实现来实现这个接口。
然后使用 IoC(控制反转)/DI(依赖注入)根据提供的配置值决定在运行时使用哪个接口。
在您的代码中使用支付网关的方法中,您将使用构造函数注入在接口中传递,您的 DI 框架将负责选择正确的实现。例如
public class Payment
private readonly IPaymentGateway _paymentGateway;
public Payment(IPaymentGateway paymentGateway)
_paymentGateway = paymentGateway;
public MyMethod()
//get your models prepared etc.
_paymentGateway.MakePayment(cardDetails, addressDetails);
【讨论】:
以上是关于用于多个支付网关的最佳模式的主要内容,如果未能解决你的问题,请参考以下文章