Разработчики реализуют команды, заключая их в состав модуля XAF. Чтобы использовать в модуле инфраструктуру команд, разработчик должен подключить к модулю сборку Xafari, пространство имен Xafari.Commands которой содержит необходимые классы и интерфейсы. Чтобы ознакомится с диаграмма классов, входящих в сборку, обратитесь к документу Консольный запуск.

Класс разрабатываемого модуля должен реализовать интерфейс ICommandEnumerator. Этот интерфейс содержит единственное IEnumerable свойство Commands. Его можно реализовать на основе блока итератора:

        public IEnumerable<ICommand> Commands

        {

            get

            {

                yield return new DemoCommand(); // Команда реализована классом DemoCommand.

            }

        }

Каждая команда должна быть закодирована в отдельном классе, который реализует интерфейс ICommand или ICommandExtIO. Рассмотрим члены этих интерфейсов:

Интерфейс ICommandExtIO расширяет ICommand, вводя два новых свойства - Error и In.

C:\Utils\RunCmd.exe demo < somedata.dat

Абстрактные классы CommandBase и CommandExtIOBase реализуют интерфейсы ICommand и ICommandExtIO. Эти классы рекомендуется использовать при разработке классов команд. Они уже содержат полезный код, который может быть использован при реализации многих команд.

Виртуальный метод ValidateParameters, выполняет базовую проверку корректности параметров. В случае обнаружения некорректного параметра метод генерирует исключение типа ArgumentException. Метод считает все параметры необязательными. При необходимости, разработчик может перекрыть данный метод, чтобы реализовать дополнительную проверку параметров. Для обработки некорректных параметров необходимо также генерировать исключение типа ArgumentException или его наследника.

Предусмотрена инициализация свойств Out, Error, In. При вызове команды они будут проинициализированы в любом случае. Для этих целей в качестве значений по умолчанию использованы "объекты-заглушки". Эти "объекты-заглушки" не выполняют никаких действий, но позволяют разработчику избегать проверок свойства на null каждый раз, когда необходимо выполнить вывод данных.

При использовании указанных абстрактных классов, код, реализующий команду, размещается в абстрактном методе ExecuteCore. Возможно, что разработчик, реализуя команду в ExecuteCore, решит ввести дополнительные проверки параметров. Тогда, при обнаружении некорректных параметров требуется генерировать исключения только типа ArgumentException или его наследников.