Система плагинов
Расширьте просмотрщик с помощью плагинов
Ядро Doconut остаётся лёгким; дополнительный функционал поставляется в виде плагины — отдельных пакетов NuGet, которые предоставляют просмотрщики или сервисы и включаются вашей лицензией. На этой странице объясняется модель регистрации, как работает ограничение лицензий во время выполнения и как подключить собственный просмотрщик.
Регистрация плагина
Каждый пакет плагина предоставляет один класс плагина. Вы регистрируете его один раз при запуске:
builder.Services.AddDoconut(options =>
{
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});AddPlugin<TPlugin>() создает экземпляр плагина и вызывает его Register обратный вызов в реестре плагинов, хранящемся в DoconutOptions. Всё, что предоставляет плагин, помечается требуемой возможностью. AddDoconut() сразу проверяет зарегистрированные плагины: отсутствие лицензии, устаревший файл TRIAL или платная лицензия без этой возможности приводит к сбою запуска с InvalidOperationException. Регистрация Temporary/Demo сохраняется после истечения срока, но её возможности во время выполнения отзываются после даты истечения.
Контракт
Плагин реализует преднамеренно небольшой интерфейс:
public interface IDoconutPlugin
{
string Name { get; } // например "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // лицензионный шлюз
void Register(IDoconutPluginBuilder builder); // вносить вклад в просмотрщики/службы
}Внутри Register построитель принимает два типа вкладов:
builder.RegisterViewer(".dcm", () => new DicomViewer())— просмотрщик для расширения файла,builder.RegisterService<TContract>(() => …)— типизированный сервис, который могут искать другие части конвейера.
Возможности и ограничения
Возможности представляют собой единицы лицензии. Converter и Dicom поставляются как плагины по запросу; Search и Annotation являются встроенными функциями, ограниченными тем же способом. Базовый просмотрщик не является возможностью — он является предварительным условием, представляемым как IsViewerLicensed в сервисе лицензий.
Проверка при запуске обычно не позволяет плагину без лицензии попасть в конвейер запросов. Фабрика просмотрщиков также применяет два защитных правила во время выполнения, которые важны, если права меняются после запуска:
- Плагин переопределяет встроенный просмотрщик (плагин заявляет расширение, которое также обрабатывается встроенным реестром): при наличии лицензии на возможность плагин‑просмотрщик выигрывает; без неё Doconut тихо переключается на встроенный просмотрщик. Пользователи всё равно видят свой документ — просто они не получают функцию плагина.
- Только плагинный формат (например,
.dcm— у DICOM нет встроенного просмотрщика): без возможности вызов открытия завершается с ошибкой:
LicenseException: This document type requires the 'Dicom' plugin license.Активная временная лицензия предоставляет все возможности (с чистым, без водяных знаков базовым просмотром). Это классический источник неожиданностей при вводе в эксплуатацию: регистрация тех же плагинов с приобретённой лицензией, в которой отсутствует одна из их возможностей, приводит к сбою AddDoconut() во время запуска. Сравните IsCapabilityGranted(...) с вашим планом перед развертыванием. Обратная сторона: при полном отсутствии лицензии ничего не предоставляется — отсутствие лицензии не является временной лицензией.
То же ограничение проявляется на клиенте: Viewer.ReferenceScripts() и ReferenceCss() генерируют пакеты скриптов/стилей для функций, ограниченных лицензией (поиск, аннотация, …) только когда лицензия их активирует, поэтому интерфейс виджета остаётся согласованным с тем, что действительно делает сервер.
Карта функций и плагинов
В пользовательском интерфейсе продукта слово «plugin» используется как широкая метка функции, но регистрация на сервере отличается:
| Функция | Как включается | Возможность | Вклад |
|---|---|---|---|
| Аннотация | Встроено в просмотрщик; включены ресурсы аннотации | Annotation | Создание в браузере, сохранение сессий и экспорт с встраиванием |
| Поиск | Встроено в просмотрщики форматов с поддержкой поиска; включены ресурсы поиска и включено извлечение при необходимости | Search | Нативный текстовый индекс, подсветка и навигация по результатам |
| Конвертер | Установите Doconut.NET8.Converter и зарегистрируйте ConverterPlugin | Converter | Сервис конвертации C# и опциональный веб‑виджет |
| DICOM | Установите Doconut.NET8.Dicom и зарегистрируйте DicomPlugin | Dicom | Просмотр медицинских изображений для .dcm и .ima |
Аннотация и обычный поиск не используют AddPlugin<TPlugin>(); их пакеты генерируются только когда лицензия предоставляет соответствующую возможность. Конвертер и DICOM являются реализациями IDoconutPlugin по запросу.
Выпущенные пакеты плагинов
| Плагин | Пакет | Возможность | Вклад |
|---|---|---|---|
| Конвертер | Doconut.NET8.Converter | Converter | Возможность конвертации документов |
| DICOM | Doconut.NET8.Dicom | Dicom | Просмотр медицинских изображений (.dcm — только плагинный формат) |
У каждого есть отдельная страница в разделе Плагины с конфигурацией и инструкциями по использованию.
Пользовательские просмотрщики — ваш собственный обработчик формата
Вы можете подключить просмотрщик к конвейеру без создания пакета плагина, напрямую из Program.cs:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // реализует IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // необязательная конфигурация по умолчанию
});Пользовательские просмотрщики имеют приоритет над всем — как над встроенными, так и над плагинами — и не ограничиваются лицензией (это ваш код). Фабрика переходит к ImageConfig, если вы не предоставляете конфигурацию по умолчанию.
Выводы
- Плагины регистрируются явно, и их
LicenseCapabilityпроверяется во времяAddDoconut()— отсутствие или недостаточность прав, не являющихся временными, приводит к быстрому сбою. - Плагины, переопределяющие встроенные, деградируют плавно; форматы, поддерживаемые только плагинами, завершаются с ошибкой
LicenseException. - Активная временная лицензия открывает всё; в продакшене открываются только приобретённые функции. Проверьте с помощью
IDoconutLicenseServiceперед выпуском.
Была ли эта страница полезной?