Расширение / Изменение OpenIso8583.Net - PullRequest
1 голос
/ 13 февраля 2012

Я использую превосходный OpenIso8583Net для отправки / получения сообщений ISO. Однако, поскольку каждая организация имеет свое собственное определение и настройку, я хочу иметь возможность настраивать формат с минимальным прикосновением к источнику проектов, чтобы можно было легче обновлять до новых версий.
Итак, вот три настройки, с которыми я сталкиваюсь сейчас:

  • Как я могу заставить Bitmap использовать AsciiFormatter вместо BinaryFormatter? так как растровое изображение является частным полем класса AMessage, я не могу получить к нему доступ, даже если я напрямую получаю новый пользовательский класс из AMessage. И конструктор использует BinaryFormatter по умолчанию. В настоящее время я изменил конструктор без параметров Bitmap.cs для использования AsciiFormatter.
  • Та же история касается форматера переменной длины. Он использует AsciiFormatter по умолчанию. Но я бы хотел использовать BcdFormatter. Я изменил эту часть, чтобы использовать BcdFormatter по умолчанию в VariableLengthFormatter.
    Я был бы признателен, если бы кто-нибудь показал мне лучший способ обработки этих настроек путем расширения, а не изменения.
  • Предположим, я хочу отобразить поля в файле журнала. Примером может служить то, что я отобразил на Генерация MAC путем шифрования данных в разделе Fields. Сейчас я должен сделать свойство Template общедоступным и использовать следующий фрагмент: для (var i = 2; i

Как я могу получить доступ к полям, не публикуя Template? Я хочу получить доступ к методу Display полей в моей основной программе для целей регистрации.

1 Ответ

4 голосов
/ 17 февраля 2012

Я только что внес изменения в проект, чтобы разрешить это. Начиная с версии 0.5.0 (обновите свой пакет NuGet)

Растровое форматирование

Вы можете установить форматер растрового изображения в шаблоне для вашего класса сообщений. Вот пример кода:

public class AsciiIsoMsg : Iso8583
{
    // First you need to customise the template
    // The message 
    private static readonly Template template;

    static AsciiIsoMsg()
    {
        // Get the default template for the Iso8583 class
        template = GetDefaultIso8583Template();
        // change the bitmap formatter
        template.BitmapFormatter = new AsciiFormatter();
    }

    // override the base class using the template and you will be using the bitmap formatter
    public AsciiIsoMsg():base(template)
    {

    }
}

Задать длину Formatter поля

В методе static AsciiIso(), если вы измените таким образом, вы измените поле 2 для использования форматера длины BCD:

// Set field 2 to use BCD formatter
template[2] = FieldDescriptor.BcdVar(2, 19, Formatters.Bcd);

Файл журнала

Чтобы отобразить сообщение в файле журнала, используйте метод .ToString() в классе сообщений, например,

var msg = new AsciiIsoMsg();
msg.MessageType = Iso8583.MsgType._0200_TRAN_REQ;
msg[3] = "010000";
Console.WriteLine(msg.ToString());

Что дает:

0200:
   [Fixed    n         6 0006] 003 [010000]
...