D365FO – Разработка методом расширения (extension code) с использованием плагина SysPluginFactory

Category: Статьи Post Date: 15.12.2020

В AX7 метод расширения кода (extension code) обеспечивает более чистый способ добавления кода без изменения существующего. Наиболее часто метод расширение кода включает расширения классов, делегатов и плагинов. Здесь мы собираемся изучить расширения кода с помощью плагина SysPluginFactory. Помимо разделения кода, плагины играют ключевую роль в разрыве зависимостей между моделями. Для ясного понимания рассмотрим следующий сценарий из существующих классов в D365FO.

Здесь LedgerDimensionValidationRequest является членом модели Ledger, тогда как DimensionValidationRequest является членом модели Dimensions. Поскольку LedgerDimensionValidationRequest является производным классом от DimensionValidationRequest, модель Ledger имеет ссылку на модель Dimensions. Следовательно, любой класс в модели Dimensions не может напрямую использовать LedgerDimensionValidationRequest, чтобы избежать циклической зависимости.

Чтобы разорвать такую зависимость, мы можем использовать плагины. Плагины используют атрибуты для создания подклассов, которые могут альтернативно использоваться существующими классами и методами в той же базовой модели плагина.

Давайте посмотрим, как использовать SysPluginFactory.

Реализация

Шаг №1: Создайте интерфейс или абстрактный базовый класс, декорированный атрибутом ExportInterfaceAttribute.

using Microsoft.Dynamics.AX.Platform.Extensibility;

[ExportInterfaceAttribute()]

public abstract class DimensionValidationRequest implements SysPackable

{

}

Шаг №2: Создайте класс для реализации интерфейса или расширения класса, созданного на шаге 1. Примените атрибуты ниже

using System.ComponentModel.Composition;

[ExportMetadataAttribute(enumstr(LedgerDimensionType), LedgerDimensionType::Account)]

[ExportAttribute(identifierstr(Dynamics.AX.Application.DimensionValidationRequest))]

public class LedgerDimensionValidationRequest extends DimensionValidationRequest

{

}

ExportMetadataAttribute – параметры являются ключом и значением. Ключ остается неизменным для всех реализаций или подклассов.

ExportAttribute – Параметр – это имя интерфейса / родительского класса.

Шаг № 3: Чтобы создать экземпляр класса, используйте приведенный ниже код.

// Экземпляр SysPluginMetadataCollection, который содержит пару ключ-значение для идентификации класса

SysPluginMetadataCollection metadataCollection = new SysPluginMetadataCollection();

metadataCollection.SetManagedValue(

enumstr(LedgerDimensionType),

       _ledgerDimensionType);

// Экземпляр дочернего класса создается с использованием рефлексии

        DimensionValidationRequest dimensionValidationRequest = SysPluginFactory::Instance(

            identifierstr(Dynamics.AX.Application),

            classstr(DimensionValidationRequest),

            metadataCollection);

Вместо использования enumstr или classstr также можно использовать простые строковые значения. Однако использование этих методов предпочтительнее, чем простой текст в виде строки. Также, перечисления удобно использовать для идентификации нескольких реализаций базового класса.

Таким образом, SysPluginFactory помогает создавать экземпляры классов без необходимости в ссылке на дочерний класс в базовой модели, и аналогичным образом можно добавить несколько реализаций интерфейса или класса без внесения изменений в базовый класс.

Оригинал статьи доступен по ссылке.

Подписывайтесь на канал @d365neti в Telegram

Подписаться

Добавить комментарий