2015-06-20 2 views
0

Требование:Лучший шаблон будет использоваться для нескольких платежных шлюзов

У меня есть требование к интеграции с несколькими платежными системами. Однако клиент использует только один из доступных и настраивается с использованием настроек администратора.

Текущая система:

Я написал одну библиотеку каждый на платежный шлюз. Который создает кошмар обслуживания и потенциальное увеличение проектов по мере того, как запросы интеграции в шлюз (источники) увеличиваются.

Вопрос

Может кто-то предложить мне дизайн шаблон для использования в этом сценарии, чтобы может быть создавать интерфейсы и общие настройки и реализацию шлюза в соответствии с требованиями, которые уменьшают дублирование кода?

+0

Вы, на мой взгляд, ответили на свой вопрос – ChrisBint

+0

Я бы посмотрел и посмотрел, как это делают NopCommerce. Если я правильно помню, у них есть один плагин для провайдера, и почти наверняка в игре есть хотя бы один интерфейс. –

+0

как насчет стратегии дизайн шаблон? – Gilad

ответ

0

Я бы создал стандартный интерфейс для работы с общими операциями. Имейте набор объектов домена, которые передаются в эти методы.

Например, чтобы создать платеж вы можете иметь модель 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); 
    }