Механизм отключения функциональности Feature Toggle
Glossary Item Box
Общие сведения
Feature toggle — техника разработки программных продуктов, которая обеспечивает поддержку подключения дополнительной функциональности в работающем приложении. Это позволяет использовать непрерывную интеграцию, сохраняя работоспособность приложения и скрывая функциональность, которая находится в стадии разработки.
Основная идея заключается в том, что в исходном коде имеется блок с дополнительной функциональностью (зачастую не полностью реализованной) и условный оператор, в котором определяется подключена ли данная функциональность, или нет.
Добавление, включение и выключение функциональности
Для добавления, включения или выключения функциональности предназначена специальная страница FeaturesPage, расположенная по адресу:
[Адрес приложения]/0/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage
Например:
http://myсreatio.com/0/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage
Для добавления новой отключаемой функциональности укажите ее код, название и краткое описание, а затем нажмите кнопку [Добавить функциональность] ([Create feature]) (рис. 1).
Рис. 1. — Интерфейс добавления новой функциональности
Чтобы включить или выключить функциональность, используйте соответствующий признак (рис. 2, 1). Для применения изменений нажмите кнопку [Сохранить изменения] ([Save changes]) (рис 2, 2).
Рис. 2. — Включение-выключение функциональности
Хранение сведений о функциональности в базе данных
Перечень доступной для включения/отключения функциональности хранится в таблице Feature базы данных приложения. По умолчанию таблица пуста. Основные поля таблицы Feature приведены в таблице 1.
Табл. 1. — Основные поля таблицы Feature
Название | Тип | Описание |
---|---|---|
Id | uniqueidentifier | Уникальный идентификатор записи. |
Name | varchar( 250 ) | Название функциональности. |
Code | varchar( 50 ) | Код функциональности. |
Информация о состоянии функциональности (включена/отключена) содержится в поле FeatureState таблицы AdminUnitFeatureState (рис.3). Таблица AdminUnitFeatureState связывает таблицы Feature и SysAdminUnit, в которой определены пользователи и группы пользователей системы. Основные поля таблицы AdminUnitFeatureState приведены в таблице 2.
Табл. 2. — Основные поля таблицы AdminUnitFeatureState
Название | Тип | Описание |
---|---|---|
Id | uniqueidentifier | Уникальный идентификатор записи. |
FeatureId | uniqueidentifier | Уникальный идентификатор записи функциональности. |
SysAdminUnitId | uniqueidentifier | Уникальный идентификатор записи пользователя. |
FeatureState | int | Состояние функциональности. 1 — включена, 0 — выключена. |
Рис. 3. — Диаграмма взаимосвязи таблиц
Определение новой функциональности в программном коде
Для внедрения дополнительной функциональности в исходный код ее необходимо определять в блоке условного оператора, который проверяет состояние подключения функциональности FeatureState.
JavaScript на стороне клиента
Условный шаблон определения дополнительной функциональности в программном коде:
// Метод, в котором определяется дополнительная функциональность. someMethod: function() { // Проверка подключения функциональности. if (Terrasoft.Features.getIsEnabled("код функциональности")) { // Реализация дополнительной функциональности. ... } // Реализация метода. ... }
Для повышения удобства использования в состав базовой схемы модели представления BaseSchemaViewModel введен метод getIsFeatureEnabled. Поэтому метод Terrasoft.Features.getIsEnabled можно заменить на this.getIsFeatureEnabled("код функциональности").
После подключения новой функциональности, для того чтобы она появилась в клиентском коде и была загружена браузером на стороне клиента, необходимо обновить страницу.
C# на стороне сервера
Для использования Feature toggle в схемах исходного кода на серверной стороне в классе Terrasoft.Configuration.FeatureUtilities был реализован набор расширяющих методов класса UserConnection. Перечень расширяющих методов приведен в таблице 3. В этом же классе объявлено перечисление состояний функциональностей FeatureState.
Табл. 2. — Основные методы класса DataManager
Метод | Параметры | Описание |
---|---|---|
int GetFeatureState( this UserConnection source, string code ) |
code — код функциональности. |
Возвращает состояние функциональности. |
Dictionary <string, int> GetFeatureStates( this UserConnection source ) | Нет. | Возвращает состояния всех функциональностей. |
void SetFeatureState( this UserConnection userConnection, string code, int state, bool forAllUsers = false ) |
code — код функциональности; state — состояние функциональности (0/1); forAllUsers — признак установки функциональности для всех пользователей. |
Устанавливает состояние функциональности. |
void CreateFeature( this UserConnection source, string code, string name, string description ) |
code — код функциональности; name — название функциональности; description — описание функциональности. |
Создает новую функуциональность. |
bool GetIsFeatureEnabled( this UserConnection source, string code ) |
code — код функциональности. |
Проверяет подключена ли функциональность. |
Условный шаблон определения дополнительной функциональности в программном коде:
… // Пространство имен, в котором определена возможность переключения // дополнительной функциональности. using Terrasoft.Configuration; … // Метод, в котором будет определяться дополнительная функциональность. public void AnyMethod() { // Проверка, включена ли функциональность. if (UserConnection.GetIsFeatureEnabled("код функциональности")) { // Реализация дополнительной функциональности. } // Реализация метода. ... }
Установка значения состояния функциональности выполняется вызовом метода SetFeatureState:
UserConnection.SetFeatureState("код функциональности", FeatureState);