Описание

Механизм Слоев позволяет установить соответствие между значениями Настроек и объектами произвольного бизнес-класса. Основной вариант использования Слоев значений в Настройках приложения продемонстрирован в приложении Xafari Northwind.

В приложении присутствует три Слоя значений:

User Slice является последним, он обеспечивает соответствие между значениями Настроек и пользователями приложения (т.е. экземплярами типа Xafari.Northwind.Security.InheritedUser). Для каждого пользователя в User Slice присутсвуют персональные значения Настроек.

В приложении Xafari Northwind Настройки используются при создании новых бизнес-объектов. Например, Настройка Classifier.Product.Category задает значение по умолчанию для поля Category объекта Product. Приложение обращается к значениям Настроек текущего пользователя.

Department Slice является промежуточным. Значения настроек в Department Slice и значения Настроек в User Slice состоят в отношении иерархической подчиненности (parent-child), т.е. каждый набор значений в Department Slice имеет несколько подчиненных наборов в User Slice. Логика определения дочерних объектов реализована в классе NorthwindSettingsDepartment (cм. ниже).

Default Slice является обязательным и должен присутствовать всегда. Пользователь имеет доступ только к своим персональным значениям Настроек. Администратор имеет доступ ко всем значениям Настроек во всех Слоях.

Значение Настройки, заданное в вышестоящем Слое, является значением по умолчанию для следующего Слоя.

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

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

Реализация

Пример использования Настроек с одним Слоем значений описан в разделе Начало работы. Для реализации множества Слоёв значений Настроек следует использовать специальные абстрактные классы из пространства имен Xafari.BC.Settings.

Класс SettingsDefaultValueSlice<TNextSlice> является базовым для Слоя по умолчанию (default Slice). TNextSlice - тип следующего слоя.

 

    public class NorthwindSettingsDefaultValueSlice : SettingsDefaultValueSlice<NorthwindSettingsDepartment>

    {

 public NorthwindSettingsDefaultValueSlice(SettingsAccessor.ServiceSpaceContext serviceContext) : base(serviceContext)

 {

 }

 

 public override IEnumerable<NorthwindSettingsDepartment> GetChildrenFromNextSlice()

        {

            var departments = this.ObjectSpace.GetObjects<Department>();

            return departments.Select(slice1 => (NorthwindSettingsDepartment)this.GetChildSlice(slice1)).ToList();

        }

    }

 

Замечание

В конструктор передана ссылка на объект типа Xafari.BC.Settings.SettingsAccessor.ServiceSpaceContext, который обеспечивает доступ к значениям Настроек. Это обязательный прием.

Класс SettingsValueSlice<TKey, TPrevSlice, TNextSlice> является базовым для промежуточного Слоя.

 

    public class NorthwindSettingsDepartment : SettingsValueSlice<DepartmentNorthwindSettingsDefaultValueSliceNorthwindSettingsInheritedUser>

    {

  public NorthwindSettingsDepartment(SettingsAccessor.ServiceSpaceContext serviceContext) : base(serviceContext)

  {

  }

 

  public override string Name

        {

            get { return this.SliceObject.Name; }

        }

 

        public override IEnumerable<NorthwindSettingsInheritedUser> GetChildrenFromNextSlice()

        {

            var users = this.ObjectSpace.GetObjects<InheritedUser>(CriteriaOperator.Parse("Department = ?"this.SliceObject));

            return users.Select(user => (NorthwindSettingsInheritedUser)this.GetChildSlice(user)).ToList();

        }

    }

 

Класс SettingsValueSlice<TKey, TPrevSlice> является базовым для последнего Слоя.

 

    public class NorthwindSettingsInheritedUser : SettingsValueSlice<InheritedUserNorthwindSettingsDepartment>

    {

     public NorthwindSettingsInheritedUser(SettingsAccessor.ServiceSpaceContext serviceContext) : base(serviceContext)

     {

     }

    }

 

Существует также два абстрактных класса, которые позволяют определить Слои, основанные на иерархических объектах. Это означает, что значения Настроек, привязанные к такому Слою, будут повторять (дублировать, соблюдать) иерархию "образующих" объектов.

Класс SettingValueSliceHiearchy<TKey, TPrevSlice, TNextSlice, TThisType> является базовым для промежуточного Слоя с поддержкой иерархичности.

Класс SettingValueSliceHiearchy<TKey, TPrevSlice, TThisType> является базовым для последнего Слоя с поддержкой иерархичности.

Все реализованные Cлои обязательно надо указать в наследнике класса SettingsAccessor, эта процедура описана в разделе Доступ к значениям Настроек.

Полный код, использованный в документе, можно изучить в файле Xafari.Northwind|NorthwindSettingsAccessor.cs демо приложения Northwind, установленного вместе с Xafari. Более общий и абстрактный пример реализации Слоев представлен в приложении Feature Center, см. файл Xafari.FeatureCenter|FCSettingsAccessor.cs.