English version

Описание примера добавления пользовательских и системных настроек в учебное приложение Xafari Nortwind с использованием компонента Xafari.BC.Settings

Справочно о Xafari.BC.Settings

При типовом применении функционала компонента, понятие Настройка представляет собой хранимое значение глобальной переменной в рамках системы. Значение настройки может быть изменено как глобально для всех пользователей прикладной системы, так и уточняться для определенного пользователя или роли. Для реализации подобного поведения используется понятие слоя. Слой позволяет переопределять значение настройки на следующем слое, например слой "по пользователям" позволяет определить значение для: 1) глобальное значение 2) значение для роли 3) значение для пользователя. Данный функционал может так же применяться в прикладных целях, например, настройка в зависимости от типа документа, в данном случае слоем будет являться тип документа.

Особенность настроек состоит в следующем:

  1. Настройка представляет собой глобальную хранимую переменную
  2. Добавить новую настройку можно только в Visual Studio
  3. Определить значение настройки можно в приложении (для этого используются специальные формы ориентированные на пользователя и администратора)
  4. Значения настроек хранятся в БД сервера

Постановка учебной задачи

Дальнейшее описании будет приведено для учебного приложения Xafari Nortwind. В приложение необходимо добавить настройки доступные пользователю для задания значений. Список требуемых настроек приведен в таблице:

 НастройкаТип настройки
CategoryCategory (persistent)
ShortNameString
HomePageString
RegionString
TerritoryNameString
CodeString
EmployeeEmployee (persistent)
ShippedDateDateTime

Так же выставим дополнительное требование по объединению настроек в следующие группы:
northwind settings group structure
Необходимо предоставить определять значений настроек на уровнях:

  1. Глобальное значение - для всех пользователей
  2. На уровне подразделения пользователя
  3. На уровне пользователей

Для этого необходимо определить соответственно ТРИ слоя:

  1. слой по умолчанию
  2. слой, основанный на объектах типа Department
  3. слой, основанный на объектах типа InheritedUser

Каждый элемент второго слоя будет основан на экземпляре Department, его потомками будут элементы, основанные на тех экземплярах InheritedUser, которые относятся к указанному департаменту:
northwind settings hierarchy

Подключение модулей

Для начала работы с настройками приложения необходимо подключить следующие модули:
XafariBCSettingsModule в платформенно независимую часть прикладного решения.
В каталоге References, проекта, добавится ссылка на соответствующую библиотеку.
Рекомендация: Переподключите библиотеку вручную.

Подключение модулей

  • Подключите модуль XafariBCSettingsModule в платформенно независимую часть прикладного решения
  • В каталоге References, проекта,  добавится ссылка на библиотеку XafariBCSettings
  • Рекомендация: Переподключите библиотеку вручную.
  • Подключите XafariBCSettingsWinModule или XafariBCSettingsWebModule  в соответствующую зависимую часть прикладного решения:
  • В каталоге References, соответствующего проекта, добавится ссылка на соответствующую библиотеку.
  • Рекомендация: Переподключите соответствующие библиотеки вручную.

Описание слоев настроек

Описание последнего слоя:

Данный код говорит о том, что экземпляры класса NorthwindSettingsInheritedUser будут предоставлять последний свой в иерархии слоёв, а также:
- основываться на объекте типа InheritedUser;
- родительный слой для данного слоя будет типа NorthwindSettingsDepartment;
- при обращении к списку дочерних слоёв всегда будет возвращаться пустая коллекция.

Описание промежуточного слоя:

Данный код говорит о том, что экземпляры класса NorthwindSettingsDepartment будут предоставлять промежуточный слой в иерархии слоёв, а также:
- основываться на объекте типа Department;
- родительный слой для данного слоя будет типа NorthwindSettingsDefaultValueSlice;
- дочерние слои для данного слоя будут типа NorthwindSettingsInheritedUser;
- метод GetChildrenFromNextSlice() описывает логику получения дочерних слоёв, для дочерних слоёв данного слоя;
- при обращении к полю Name будет возвращать поля Name объекта (объекта на основании которого построен слой) типа Department.

Описание слоя по умолчанию:

Данный код говорит о том, что экземпляры класса NorthwindSettingsDefaultValueSlice будут предоставлять слой по умолчанию в иерархии слоёв, а также:
- дочерние слои для данного слоя будут типа NorthwindSettingsDepartment;
- метод GetChildrenFromNextSlice() описывает логику получения дочерних слоёв, для дочерних слоёв данного слоя;
- родительный слой для данного слоя будет null.

Описание настроек и групп настроек

Опишем интерфейс, содержащий настройки для приложения Northwind:

В платформенно независимом модуле (файл Module.cs) расширим узел модели Setting узлом настроек приложения Northwind:

Добавим 3 группы настроек, Documents, Classifiers, Olap. Интерфейс настроек IModelNorthwindSettings примет следующий вид:

Для описания группы настроек Documents использовался следующий код:

Группа Documents включает в себя группу Order:

Группа Order включает в себя 2 настройки. Настройка ShippedDate имеет тип IModelKeyDateTime, который предоставляется платформой XAFARI. Настройка Employee имеет тип IModelKeyEmployeeObject и является персистентной, код описывающий настройку типа IModelKeyEmployeeObject:

Обратите внимание, что при описании настройки персистентного типа интерфейс настройки необходимо наследовать от интерфейса IModelBCSettingsObjectItem, а доменную логику от класса IModelBCSettingsXPObjectItemLogic. Во всем остальном процесс создания настройки персистентного типа не отличается от процесса создания настройки не персистентного типа.

Вернёмся к описанию настроек для приложения Northwind.

Группа настроек Classifiers описывается следующим образом:

Как мы видим из описания группа Classifiers включает в себя гуппы Product, Territory, Supplier. Данный группы и содержащиеся в них настройки описываются следующим образом:

Группа Product:

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

Группа Territory:

Группа Supplier:

Работа с SettingsAccessor’ом

На данном этапе мы описали слои настроек, а также сами настройки.

Вся работа с настройками и слоями производится через Instance класса SettingsAccessor.  Вследствие чего, для работы с настройками приложения Northwind необходимо реализовать свой класс SettingsAccessor на основе базового:

Класс NorthwindSettingsAccessor необходимо наследовать от класса SettingsAccessor, и задать некоторые свойства класса SettingsAccessor:

- RootSlice свойство, которому необходимо присвоить экземпляр слоя по умолчанию.

-SliceTypes свойство, которому необходимо присвоить массив типов слоёв использованных в данной иерархии слоёв, за исключением типа слоя по умолчанию.

После проделанных выше манипуляций свойству Instance класса SettingsAccessor, необходимо присвоить экземпляр описанного выше класса(данное присваивание производится по событию LoggedOn у приложения):

Как видно из кода, свойству CurrentSlice присваивается слой сообтветствующий текущему пользователю, если не присваивать ничего, свойство CurrentSlice будет соответствовать слою по умолчанию.

Ознакомится с результатами вышеописанной работы можно в демо-центре Xafari:

Примеры настроек в демо-центре

Примеры настроек в демо-центре