Архитектура Дизайнера

Архитекута Дизайнера построена на использовании технологии Composite Application Block/Smart Client Software Factory (http://smartclient.codeplex.com/).
Полную документацию по технологии можно посмотреть на сайте.
В дополнении к стандартной реализации CAB в ELMA реализован дополнительный функционал (сборка EleWise.ELMA.SDK.Design, пространство имен EleWise.ELMA.Design.CompositeUI), включающий в себя:

  • поддержку Ribbon-интерфейсов;
  • команд с передачей параметров.

Основные понятия:

  • WorkItem (рабочий элемент) – основной контейнер для управления объектами. Он может хранить состояние объекта (State), публиковать или подключать сервисы (Services), команды (Commands), события (EventTopics), представления (SmartParts), подчиненные рабочие элементы (WorkItems). Кроме того, может содержать внутри себя любые другие объекты (Items). У рабочего элемента есть статус (Active, Inactive, Terminated), который может изменяться вызовами методов Activate, Deactivate, Terminate;
  • Service (сервис) – любая служба, реализующая некоторую логику. Опубликованная служба может быть доступна из любого рабочего элемента. Публикация сервиса осуществляется через Services.Add<>(), получение – через Services.Get<>() или создание свойства с навешиванием атрибута ServiceDependency;
  • Command (команда) – любая команда, которая может вызываться через визуальные элементы управления или через код. Подписка может осуществляться через объявление метода с навешиванием атрибута ExtCommandHandler;
  • EventTopics (события) - события.


Иерархия рабочих элементов:
В CAB-приложении всегда существует один корневой рабочий элемент.

У каждого рабочего элемента могут быть наследники. Таким образом, получается древовидная структура элементов.

Для рабочих элементов, унаследованных от класса BaseWorkItem можно задать имя группы (свойство GroupName).

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

Для наглядности приведем пример статусов рабочих элементов в определенный момент времени (открыт раздел Процессы, вкладка Список процессов, запущен визард создания процесса на 2-м шаге). Активные рабочие элементы выделены жирным шрифтом. Названия групп, если они есть, указаны в скобках.:

RootWorkItem
|- OrganizationModuleWI
|-ProcessModuleWI
|-ProcessListWI (группа TabItem). Список процессов.
|- ProcessWI (группа TabItem). Процесс "Заявление на отгул"
|- ProcessWI (группа TabItem). Процесс "Заявление на отгул"
|-ProcessWizardWI. Визард создания процесса
|- ProcessStep1WI. 1-й шаг визарда
|-ProcessStep2WI. 2-й шаг визарда
|- ProcessStep3WI. 3-й шаг визарда
|- DocumentModuleWI
|- MetadataModuleWI

Активность рабочих элементов влияет на статусы команд. При деактивации рабочего элемента все его команды становятся недоступными. Как следствие, скрываются визуальные элементы, привязанные к данным командам.