Архитектура WebMoney Business Tools

Архитектура WebMoney Business Tools основана на контрактах. Подключаемые модули не знают с какой именно реализацией контракта они работают.

Реализацию контрактов можно заменять простым копированием библиотек и файла конфигурации плагинов (Extensions.json или Extensions.xml) в папку с программой. В одной библиотеке можно разместить множество плагинов, не обязательно для каждого плагина создавать отдельную библиотеку. Подключение происходит автоматически на основе данных файла Extensions. См. подробную информацию о создании плагинов.

Схема контрактов сервисов

Контракты сервисов независимы друг от друга:

Схема контрактов подключаемых модулей

Контракты подключаемых модулей делятся на 3 категории:

  1. FormProvider отдают форму (наследник класса Form).
  2. ActionProvider выполняют действие, например, копирование в буфер обмена.
  3. ScreenProvider отдает элемент формы (наследник класса Control).

Особняком стоит SessionContextProvider, который отдает сессию.

Независимо от категории, каждый из контрактов обязательно имеет метод CheckCompatibility. Этот метод должен проверить способен ли модуль отработать в переданном контексте (к примеру, модуль для создания операции не сможет отработать в контексте кошелька C-типа). Метод можно использовать для сокрытия пунктов меню, которые вызывают данный модуль.

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

Точка входа WMBusinessTools.exe

Главная программа (точка входа) WMBusinessTools.exe практически не содержит логики. Вся ее функция сводится к запуску трех обязательных подключаемых модулей:

  1. Модуль первичной конфигурации ConfigurationService.
  2. Модуль создания сессии Enter.
  3. Модуль создания главной формы (главного окна) Main.

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

WMBusinessTools.exe зависима от:

  1. Контрактов WM-сервисов WebMoney.Services.Contracts. В библиотеке WebMoney.Services (реализация контрактов) все основные операции без привязки к графическому интерфейсу пользователя (GUI): работа с API, сохранение промежуточных данных в базе данных, работа с ключами и пр.
  2. Своих контрактов WMBusinessTools.Extensions.Contracts. В WMBusinessTools.Extensions выполнена реализация всех форм. Формы можно заменять на свою собственную реализацию (добавлять пункты меню, экраны и пр.) без перекомпиляции программы.
  3. Вспомогательных библиотек-утилит: ExtensibilityAssistant добавляет работу простую с плагинами, а LocalizationAssistant добавляет простую локализацию (аналог Unix gettext, дополненный категорией для удобства перевода).

Основные сервисы WebMoney.Services

Библиотека WebMoney.Services является базовой реализацией контрактов WebMoney.Services.Contracts. Здесь находится реализация взаимодействия с XML и SOAP-интерфейсами системы, работа с базой данных, работа с внешними файлами (импорт и экспорт), логика проведения массовых платежей. Важно отметить, что библиотека не имеет привязки к графическому интерфейсу пользователя.

Частично взаимодействие с внешними сервисами опосредовано и подключается посредством инверсии зависимостей (IoC) с применением фреймворка Unity.

Библиотека WebMoney.Services зависима от:

  1. Своих контрактов WebMoney.Services.Contracts (реализует их).
  2. Вспомогательных утилит (ExtensibilityAssistant, LocalizationAssistant).
  3. Библиотек для работы с WM-интерфейсами (WM-API и WMSignerFX).

Реализация графического интерфейса WMBusinessTools.Extensions

WMBusinessTools.Extensions реализует формы, с которым работает пользователь. В версии 2.0 интерфейс выполнен по технологии WinForms.

Библиотека зависима от:

  1. Своих контрактов WMBusinessTools.Extensions.Contracts.
  2. Контрактов WM-сервисов WebMoney.Services.Contracts
  3. Вспомогательных утилит.
  4. Библиотеки Xml2WinForm. Эта библиотека реализует построение форм на основе XML или Json-шаблонов.

Библиотека Xml2WinForms

Библиотека Xml2WinForms используется программой для построения пользовательских форм на основе Json-шаблонов. Она позволяет построить форму с поддержкой проверки вводимых данных и простого поведения (как то: сокрытие/деактивация частей формы, в зависимости от состояния элементов на форме).

Вот пример JSON-шаблона:

{
  "templateLibrary": "_TemplateLibrary.json",
  "text": "Moneyback",
  "steps": [
    {
      "tunableShape": {
        "columns": [
          {
            "controls": [
              {
                "type": "GroupBox",
                "name": "ReturnPaymentGroup",
                "desc": "Return Payment",
                "column": {
                  "controls": [
                    {
                      "prototype": "PurseTemplate",
                      "desc": "From purse:",
                      "name": "SourcePurse",
                      "readOnly": true,
                      "inspectionRules": [
                      ]
                    },
                    {
                      "type": "TextBox",
                      "desc": "To purse:",
                      "name": "TargetPurse",
                      "readOnly": true
                    },
                    {
                      "type": "TextBox",
                      "desc": "Amount",
                      "name": "Amount",
                      "readOnly": true
                    },
                    {
                      "type": "TextBox",
                      "desc": "Description:",
                      "name": "Description",
                      "readOnly": true,
                      "multiline": true
                    },
                    {
                      "type": "AmountNumericUpDown",
                      "desc": "Amount to return:",
                      "name": "ReturnAmount" 
                    }
                  ]
                }
              }
            ]
          }
        ]
      },
      "actionText": "&Return" 
    }
  ]
}

И вот как выглядит форма, построенная по этому шаблону:

Посмотреть еще примеры форм можно в репозитории.

Xml2WinForms поддерживает локализацию с использованием библиотеки LocalizationAssistant. Данная библиотека работает аналогично GNU gettext, но дополнительно добавляет категорию для удобства перевода.

Использование библиотек Xml2WinForms и LocalizationAssistant не является обязательным для создания плагинов, однако могут упростить вашу работу.

База данных

Для работы с базой данных, программа использует ORM Entity Framework, благодаря чему возможна поддержка различных типов СУБД

В базовой комплектации есть поддержка SQL CE (используется по умолчанию) и MS SQL Server

Тип СУБД Провайдер данных
SQL CE System.Data.SqlServerCe.4.0
MS SQL Server System.Data.SqlClient

Основные таблицы:

Более детально таблицы для хранения данных операций:

TransferBundle и PreparedTransfer — это пакет операций для массового проведения и эти операции соответственно.