Параметры базы - QualitySolution/QSProjects GitHub Wiki

Введение

Во всех наших проектах в базе данных существует таблица base_parameters которая содержит различные настройки приложения на уровне базы данных. Стандартные модули хранят там версию базы данных и т.п. Но каждый проект может использовать эту таблицу для хранения различных настроек.

Внутри таблица base_parameters содержит всего две колонки name и str_value. Колонка с именем параметра должна быть уникальна это первичный ключ таблицы.

Сервис работы с параметрами базы

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

Классический режим

В классическом режиме сервис предоставляет доступ на чтение ко всем загруженным из базы данных параметрам через словарь All.

var productName = parametersService.All["product_name"];

Код выше показывает как получить значение параметра. Создать новый параметр или обновить значение имеющегося можно через метод UpdateParameter.

parametersService.UpdateParameter("version", "2.3");

Удалить параметр можно с помощь метода RemoveParameter. Если есть необходимость повторно загрузить значения из базы данных, можно вызвать ReloadParameters.

Динамический режим

Текущая версия сервиса позволяет более удобно работать с параметрами базы данных через динамический объект. Для этого сервис нужно привести к динамическому объекту через использование ключевого слова dynamic. В этом варианте с параметрами базы можно работать напрямую, как будто параметры это просто свойства сервиса.

dynamic parameters = parametersService;
var productName = parameters.product_name;

Код выше демонстрирует пример чтение параметра с именем product_name. Если в базе данных параметра с указанным именем нет, свойство будет иметь значение null, исключение в этом случае не произойдет. Так же просто можно и устанавливать новое значение параметра или создать новый параметр.

parameters.MyNewParameter = "My Text";

Удалить параметр из базы, можно присвоив ему значение null.

parameters.MyNewParameter = null;

Конвертация параметров

По умолчанию все значение параметров это строки и в базе данных они хранятся именно в строковом формате. Получая значение из предыдущих примеров вы получаете именно то что находится в БД. Но иногда значение параметра это число или True\False. Для таких случаем есть режим автоматического преобразования значения к необходимому типу.

//В БД, строковое значение "42"
int answerToUltimateQuestionOfLife = parameters.Answer(typeof(int));

Данная возможность работает со следующими типами:

  • все встроенные числовые типы (int, uint, double, decimal и т.п.)
  • bool
  • Version
  • Guid

Так как при отсутствии параметра метод возвращает null, результат так же легко приводится к nullable типам.

Использование индексатора

Дополнительно есть возможность обращаться к параметру базы через индексатор на самом сервисе. Плюсы этого подхода, по сравнению с классическим режимом и обращении к All, в том что позволяют более однообразно работать с параметрами. Из коллекции All в классическом режиме параметры можно только читать. При этом есть необходимость проверять наличие параметра в коллекции. Обращение через индексатор позволяет работать с параметрами так же как в динамическом режиме, но с названиями параметров в виде строки. Ниже примеры. Все примеры вызовут исключение если индекс не строка.

dynamic parameters = parametersService;

//Получение параметра всегда в виде строки, вернет null если параметр еще не установлен.
var productName = parameters["product_name"];
//Установит значение параметра или создаст параметр если его не было.
parameters["MyNewParameter"] = "My Text";
//Удалит параметр из базы.
parameters["MyNewParameter"] = null;