Правильное выполнение «команд»

1

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

Однако я также хочу иметь список всех доступных команд, поэтому у меня есть возможность вызвать функции, зная имя команды - это невозможно сделать со статическими классами.

Я думал об использовании рефлексии для создания списка. Я также подумал об использовании шаблона singleton и в каждом конструкторе, добавив единственный объект в статический список, общий для всех классов "команда". Ни один из этих методов не является особенно опрятным, хотя...

Существует ли шаблон проектирования для этого сценария? Или любые методы, которые люди использовали в прошлом? Все советы были оценены!

Я использую С#, хотя это не очень актуально для вопроса.

  • 0
    Вы можете попробовать использовать Microsoft MEF - он был создан именно для таких целей, и IMO уже предоставляет функции, которых вы хотите достичь.
Теги:

2 ответа

1
Лучший ответ

Вы наметили два лучших метода.

В шаблоне реестра есть класс (реестр), в котором есть список всех доступных команд. Преимущество в том, что это просто, недостатком является то, что разработчик должен знать, что команда должна быть зарегистрирована. Используйте базовый класс, чтобы помочь разработчику (кто будет писать больше команд) в том, что делать.

Съемный шаблон - это то, где вы используете отражение, чтобы найти все загруженные типы в Current AppDomain. Это имеет то преимущество, что это можно сделать после загрузки приложения, что дает вам возможность динамически загружать сборки.

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

0

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

public interface KeyboardActionCommand
{
    void ExecuteOnKeyDown();
    void ExecuteOnKeyUp();
}

Чтобы сделать список предопределенных команд, было легко в этом случае с помощью Dictionary<string, KeyboardActionCommand>. Откат назад к этому был, если в моем случае, когда мне в конечном итоге пришлось добавлять настройки, например, когда я создал новый класс под названием OpenProgramKeyboardActionAcommand как и выведено по имени он открыл программу, но было нецелесообразно создавать кучу предопределенных версий этого класса. Вместо этого я должен был создать класс, чтобы помочь в создании этих типов команд. Однако в моем словаре у меня было несколько. example я availableCommands.Add("Open Calculator", new OpenProgramKeyboardActionCommand(@"C:\Windows\System32\calc.exe"));

поэтому у него есть откат.

Другая идея состоит в том, чтобы сделать делегата для значащей части словаря. Затем вы можете создать свой статический класс с кучей реализованных методов делегирования. Это тоже неплохо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню