Система плагинов

Расширьте просмотрщик с помощью плагинов

Ядро Doconut остаётся лёгким; дополнительный функционал поставляется в виде плагинов — отдельных пакетов NuGet, которые предоставляют просмотрщики или сервисы и включаются вашей лицензией. Эта страница объясняет модель регистрации, как ограничение лицензией работает во время выполнения, и как подключить свой собственный просмотрщик.

Регистрация плагина

Каждый пакет плагина предоставляет один класс плагина. Вы регистрируете его один раз, при запуске:

csharp
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 сохраняется после истечения срока, но её возможности во время выполнения отзываются после даты истечения.

Контракт

Плагин реализует преднамеренно небольшой интерфейс:

csharp
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 нет встроенного просмотрщика): без возможности вызов open завершается с ошибкой:
text
LicenseException: This document type requires the 'Dicom' plugin license.

Активная временная (Temporary) лицензия предоставляет все возможности (с чистым, без водяных знаков базовым просмотром). Это классический источник неожиданностей при запуске: регистрация тех же плагинов с приобретённой лицензией, в которой отсутствует одна из их возможностей, приводит к сбою AddDoconut() во время старта. Сравните IsCapabilityGranted(...) с вашим планом перед развертыванием. С другой стороны: с полным отсутствием лицензии ничего не предоставляется — отсутствие лицензии не является временной лицензией.

То же ограничение проявляется на клиенте: Viewer.ReferenceScripts() и ReferenceCss() генерируют пакеты скриптов/стилей для функций, ограниченных лицензией (поиск, аннотация, …) только когда лицензия их включает, поэтому UI виджета остаётся согласованным с тем, что действительно делает сервер.

Карта функций и плагинов

UI продукта использует термин «плагин» как широкую метку функции, но регистрация на сервере отличается:

ФункцияКак включаетсяВозможностьВклад
АннотацияВстроено в просмотрщик; включены ресурсы аннотацииAnnotationСоздание в браузере, сохранение сессии и экспорт с встраиванием
ПоискВстроено в просмотрщики форматов с поддержкой поиска; включены ресурсы поиска и включено извлечение там, где требуетсяSearchНативный текстовый индекс, подсветка и навигация по результатам
КонвертерУстановите Doconut.NET6.Converter и зарегистрируйте ConverterPluginConverterСервис конвертации C# и опциональный веб‑виджет
DICOMУстановите Doconut.NET6.Dicom и зарегистрируйте DicomPluginDicomПросмотр медицинских изображений для .dcm и .ima

Аннотация и обычный поиск не используют AddPlugin<TPlugin>(); их пакеты генерируются только когда лицензия предоставляет соответствующую возможность. Конвертер и DICOM являются выпущенными опциональными IDoconutPlugin реализациями для этого набора документации.

Утверждённые артефакты .NET 6 содержат Doconut.NET6.Converter и Doconut.NET6.Dicom той же версии, что и основной пакет.

Выпущенные пакеты плагинов

ПлагинПакетВозможностьВклад
КонвертерDoconut.NET6.ConverterConverterВозможность конвертации документов
DICOMDoconut.NET6.DicomDicomПросмотр медицинских изображений (.dcm — формат только для плагина)

У каждого есть отдельная страница в разделе Plugins с его конфигурацией и использованием.

Пользовательские просмотрщики — ваш собственный обработчик формата

Вы можете подключить просмотрщик к конвейеру без написания пакета плагина, напрямую из Program.cs:

csharp
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // реализует IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // опциональная конфигурация по умолчанию
});

Пользовательские просмотрщики имеют приоритет над всем — как над встроенными, так и над плагинами — и не ограничены лицензией (это ваш код). Фабрика переключается на ImageConfig, если вы не предоставляете конфигурацию по умолчанию.

Выводы

  • Плагины регистрируются явно, и их LicenseCapability проверяется во время AddDoconut() — отсутствие или недостаточное не временное право приводит к быстрому сбою.
  • Плагины в стиле переопределения деградируют плавно; форматы только для плагина завершаются с ошибкой LicenseException.
  • Активная временная лицензия открывает всё; продакшн открывает то, что вы купили. Проверьте с помощью IDoconutLicenseService перед выпуском.

Была ли эта страница полезной?