【问题标题】:Best pattern to be used for multiple payment gateways用于多个支付网关的最佳模式
【发布时间】:2015-09-06 11:01:04
【问题描述】:

要求:

我需要与多个支付网关集成。但是,客户端仅使用其中一种可用的,并且使用管理员设置进行配置。

当前系统:

我为每个支付网关编写了一个库。随着网关集成请求(源)的增加,这会造成维护噩梦和项目的潜在增加。

问题

有人可以建议我在这种情况下使用的设计模式,可以创建接口和通用设置并根据需要实现网关以减少重复代码吗?

【问题讨论】:

  • 在我看来你已经回答了你自己的问题
  • 我会去看看 NopCommerce 之类的公司是如何做到的。如果我没记错的话,他们每个提供商都有一个插件,而且几乎可以肯定至少有一个界面在使用。
  • 策略设计模式怎么样?
  • 如果您有一些代码在您的各种支付项目库中重复出现,那么创建另一个项目,您可以在其中定义一个抽象支付类,所有其他支付提供商都从该类派生。因此,现在跨多个项目的所有通用代码都在一个抽象类中,并且更易于维护。

标签: c# .net design-patterns architecture


【解决方案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);
    }

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2011-05-07
    • 2013-03-03
    • 1970-01-01
    • 2016-12-29
    • 2010-12-09
    • 2022-06-19
    • 2014-08-20
    • 2010-11-06
    相关资源
    最近更新 更多