2. Расширение ELMA BPM. Сервисы и Компоненты

Дорабатывая ELMA BPM — важно не ухудшить состояние «пациента».

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

Речь пойдет о том как правильно добавлять новый функционал и расширять логику ядра системы.

Основа — Autofac

— IoC контейнер для инверсии управления и внедрения зависимостей (Из первого урока)

Основная идея внедрения зависимостей

  • Один раз зарегистрировать сервис
  • Много раз вызывать получение этого сервиса от Autofac

Напомню что Autofac в ELMA  — доработан в отличие от стандартного — например в ELMA :

  • ServiceScope — область применения сервиса (один экземпляр на приложение, один экземпляр на UnitOfWork и так далее)
  • Locator — локатор сервисов (по сути менеджер сервисов, регистрирует сервисы и отдает готовые )

В Autofac этого нет, отличить доработки ELMA можно посмотрев на namespace (пространство имен)

  •  они начинаются с EleWise (так называется производитель)

Атрибуты

Основные атрибуты для расширения функционала ELMA BPM

Для сервиса

сервис это класс который содержит логику за которую отвечает (например IMembershipService — Сервис управления учетными записями пользователей)

ServiceAttribute

атрибут автоматически регистрируемой службы (класс с таким атрибутом — можно будет получить через Locator )

  1. опишите интерфейс -> реализуйте интерфейс в классе и пометьте класс [Service]
  2. теперь локатор сервисов (Locator) по интерфейсу — вернет готовый к работе экземпляр класса — сервис

В системе используется  только одна реализация сервиса

  • если зарегистрировать еще один такой же сервис (пометить атрибутом Service) — будет использоваться последний

Не будем усложнять, вот пример новой логики в синхронизации пользователей

Для расширений

— точки расширения и расширения системы содержат части однотипной логики

  • ELMA вызывает все компоненты — реализации точки расширения

например MorpherTemplateGeneratorFunctions  — одно из расширений ITemplateGeneratorFunctionsContainer — добавляет функционал Морфера (склонение по падежам)

ExtensionPointAttribute 

— Атрибут интерфейса точки расширения (указывает — что функционал можно расширить реализовав это интерфейс)

ComponentAttribute

—  Атрибут компонента, реализующего точки расширений

Компонентов (реализаций точек расширения) — может существовать сколько угодно и они дополняют друг друга

  • это значит если зарегистрировать еще один компонент (пометить атрибутом Component) — использоваться будут оба в зависимости от того что вызвали

Чью логику можно изменить

Примеры ELMA BPM — то что можно изменить и показалось мне интересным

Сервисы

  • EntityModelHistoryService —  Сервис получения истории изменений из менеджера EntityModelHistoryManager
  • FilePreviewService —  Сервис для работы с предпросмотром файлов
    • можно из файла получить html
  • SystemFileNHManager —   Менеджер работы с системными фалами (EleWise.ELMA.Files.SystemFile)
    • для получения дополнительной информацию о файле из базы данных — размер, хеш
  • EmailSender —  С помощью данного сервиса отправляют сообщения по электронной почте
  • Остальные изучите с помощью декомпилятора

Точки расширения

  • ICommentActionHandler —  обработчик действий при добавлении комментариев к объекту
  • IInitHandler — обработчик при загрузке ELMA
    • при загрузке ELMA можно выполнить действие
  • IAddressProvider —   провайдер для адреса
    • для разных стран — сделать разный адрес
  • IQueryFunctionResult —  расширение, для добавления новых функций в запросы EQL
  • IEntityManager —  интерфейс менеджера сущности
  • Остальные изучите с помощью декомпилятора

Компоненты

— реализации отдельной точки расширения (методы и поля называются также, а логика зависит от компонента )

Поэтому правильно будет показать как искать примеры компонентов — реализаций точек расширения

  • С помощью декомпилятора выберите нужную точку расширения (например IInitHandler)  и проанализируйте

 

Как правильно добавлять сервисы и расширения

Как

  • переопределить системный сервис и добавить новый функционал существующей точки расширения — понятно
  • создать сервис или точку расширения — точно также как в примерах (примеры выше и в декомпиляторе)

Сервис

Создание нового сервиса

  1. Опишите интерфейс (что делает сервис)
  2. Реализуйте интерфейс в классе (опишите логику)
  3. Пометьте класс атрибутом Service

Точка расширения

Создание новой точки расширения

  1. Опишите интерфейс (что делает точка расширения)

Компонент

Создание нового компонента

  1. Реализуйте интерфейс в классе (опишите логику)
  • Напоминаю реализаций точек расширения много и вызовутся все

Не забудьте вызвать свою точку расширения

— никто ее за вас не вызовет

Нюансы

  • ELMA BPM использует внедрение значений свойств (Поля публичные заполнятся автоматически)
    • этот способ сложный с точки зрения логики  и советую зависимости указывать в конструкторе (сервисы нужные для сервиса)
    • Например сервису «Обновления контрагентов» — нужны сервис «Подсказок Dadata» и сервис «Подсказок по контрагенту» 
      • Указав в конструкторе — Autofac автоматически заполнит когда вы запросите сервис «Обновления контрагентов»
  • Сервисы можно писать в
    • собственном модуле ELMA (в среде разработки Visual Studio)
    • глобальном модуле в дизайнере
  • Мы не затронули менеджеры сущностей ELMA — для Autofac и ELMA это такие же компоненты и реализуют точку расширения IEntityManager

Вывод

Для гибкой и модульной разработки — использовуйте Сервисы и Компоненты.

  • Новый сервис для переопределения базовой логики и гибкой разработки
  • Новый компонент для добавления нового функционала и расширяемой логики

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


Статьи для прочтения

Статьи из базы знаний ELMA BPM

  1. Компонентная модель —  немного сложнее чем я объяснил — если будут вопросы — пишите в комментарии
  2. Архитектура ядра системы — снова про сервисы и Autofac — теперь будет понятнее о чем идет речь
  3. Локатор сервисов системы — как получить внутренние сервисы приложения, как зарегистрировать

Мои статьи

  1. Как импортировать новые поля из LDAP в ELMA — пример переопределения системного сервиса
  2. Декомпилятор IlSpy — поможет искать сервисы, точки расширения и примеры.

Задания

  1. Добавить в ELMA новую функцию в генератор текста по шаблону
    • Принимает пользователя — в шаблоне результатом будет количество дней с его регистрации в системе
  2. При переназначении пользователя в задаче по процессу — изменять пользователя в объекте из контекста процесса
    • В контексте есть контрагент — в контрагенте ответственный
    • При переназначении задачи — нужно перехватить событие и изменить в указанном контрагенте ответственного
  3.  Переопределить «Сервис для работы с активными сессиями пользователей» (ActiveUserSessionService)
    • при попытке добавить новую сессию — записывать в файл (временный в системе ) —  Клиентский IP-адрес и ФИО пользователя
  4. Добавить новую функцию в EQL
    • функция CurrentYear() — которая возвращает начало текущего года (например 01.01.2018)
  5. Написать свой сервис для обновления данных в контрагенте
    • Описать интерфейс сервиса и реализовать сервис
    • Сервис должен иметь один метод обновления количества взаимоотношений (количество взаимоотношений — это новое поле в контрагенте)
    • в реальной системе это пригодится если будете делать интеграцию с 1С или Контур.Фокус
  • выполняйте задания только на своих серверах

в следующий раз поговорим о проектировании объектной модели

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

%d такие блоггеры, как:

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: