Безопасные флаги функций .NET с помощью FeatureToggle

Вчера Я писал о флагах функций в обзорной статье, в значительной степени независимой от языка.

Сегодня я хочу обсудить свою любимую библиотеку для флагов функций в приложениях .NET: FeatureToggle Джейсона Робертса.

Feature Toggle - это очень маленькая специализированная библиотека, предназначенная для множества гибких вариантов переключения функций.

В Feature Toggle вы определяете переключаемую функцию как класс, расширяющий класс FeatureToggle, например SimpleFeatureToggle или IFeatureToggle интерфейс.

Простое определение функции могло бы выглядеть так:

Затем эту функцию можно проверить следующим образом:

Приведенный выше код будет искать запись в файле конфигурации приложения (appSettings.json, web.config или app.config в зависимости от типа запущенного приложения) и анализировать это значение как логическое, чтобы определить, возвращает ли FeatureEnabled истину или ложь.

Здесь приведен пример файла .NET Core appSettings.json с флагом функции:

Дизайн FeatureToggle

Пустые / маркерные классы и создание экземпляра объекта, чтобы просто проверить свойство на нем и выбросить? Как это могло быть хорошо?

Что ж, оказывается, что код выглядит так, потому что Джейсон Робертс намеренно разработал FeatureToggle, чтобы затруднить совершение типичных ошибок, связанных с флагами функций.

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

Кроме того, поскольку FeatureToggle использует имена классов для поиска параметров конфигурации, в коде нет скрытых строк, которые могут содержать опечатки, вызывающие проверку неправильного параметра конфигурации.

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

Очистка образца кода

Если приведенный выше код вызывает проблемы, его можно упростить, используя статическое свойство, подобное следующему:

Благодаря использованию статического получателя IsFeatureEnabled вызывающему коду больше не нужно создавать экземпляр класса пространственных объектов, и код читается намного проще. Кроме того, у вас больше нет пустого класса из-за статического свойства и поля экземпляра.

Различные типы функций

FeatureToggle также разработан, чтобы быть гибким и предлагать расширяемость за счет создания подклассов или использования интерфейса IFeatureToggle.

Например, я мог бы написать реализацию, которая активна только по выходным, написав следующее:

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

Хорошая новость в том, что вам не нужно создавать более сложные вещи. FeatureToggle поставляется с рядом встроенных реализаций:

  • SimpleFeatureToggle - пример, с которым мы работали до этого момента. Считывает значение из файла конфигурации.
  • EnabledOnOrAfterDateFeatureToggle - функция, которая доступна только после наступления даты. Это может быть использовано как свидание для начала.
  • EnabledOnOrBeforeDateFeatureToggle - функция, которая доступна только до наступления даты. Это можно использовать как дату выхода на пенсию.
  • EnabledBetweenDatesFeatureToggle - функция, которая доступна только между двумя датами.
  • EnabledOnDaysOfWeekFeatureToggle - функция, доступная только в определенные дни недели.
  • AlwaysOnFeatureToggle - обозначает функцию, которая всегда будет активирована, несмотря ни на что. Это можно использовать для перехода от управления конфигурацией без полного удаления класса.
  • AlwaysOffFeatureToggle - аналогично AlwasOnFeatureToggle, но никогда не будет активен.
  • HttpJsonFeatureToggle - отправляет HTTP-запрос GET в расположение, указанное в файле конфигурации функции, и ожидает результата типа {"enabled": true}, а затем анализирует это значение enabled, чтобы определить, включена ли функция. Имейте в виду, что это будет синхронный веб-вызов, который может привести к ошибкам из-за проблем с сетью, Интернетом и брандмауэром.
  • SqlFeatureToggle - с его помощью вы определяете как строку подключения в своей конфигурации, так и SQL-запрос, который возвращает одно логическое значение. Это значение затем является возвращаемым значением для того, включена ли функция или нет. Опять же, это синхронная операция, которая подвержена большему количеству ошибок, чем многие другие реализации.
  • EnabledOnOrAfterAssemblyVersionWhereToggleIsDefinedToggle - сравнивает текущую версию сборки с версией, определенной в файле конфигурации, и активирует функцию, если настроенная версия прибыла. Это можно использовать для планирования функций, которые будут реализованы с основными номерами выпусков, не зная даты, когда эти выпуски будут отправлены.

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

Если вы хотите узнать больше о FeatureToggle, загляните в репозиторий GitHub и попробуйте библиотеку.

Если вам нужны дополнительные учебные материалы, посмотрите замечательный курс Джейсона Роберта Pluralsight. Так я впервые узнал о библиотеке, и очень интересно наблюдать, как инструктор ведет курс по созданной ими библиотеке.

Первоначально опубликовано на https://dev.to 21 сентября 2019 г.