Система Плагінів

Розширте переглядач за допомогою плагінів

Ядро 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. Реєстрація Тимчасова/Demo зберігається після закінчення терміну, але її можливості під час виконання відкликаються після дати закінчення.

Контракт

Плагін реалізує навмисно невеликий інтерфейс:

text
public interface IDoconutPlugin
{
    string Name { get; }                          // e.g. "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // the license gate
    void Register(IDoconutPluginBuilder builder); // contribute viewers/services
}

У методі Register будівельник приймає два типи внесків:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — переглядач для розширення файлу,
  • builder.RegisterService<TContract>(() => …) — типізований сервіс, який інші частини конвеєра можуть знайти.

Можливості та обмеження

Можливості (capabilities) — це одиниці ліцензії. Converter і Dicom постачаються як плагіни за вибором; Search і Annotation — вбудовані функції, які обмежуються так само. Базовий переглядач не є можливістю — це передумова, представлена як IsViewerLicensed у сервісі ліцензій.

Зазвичай перевірка під час запуску запобігає потраплянню непідкритого плагіна у конвеєр запитів. Фабрика переглядачів також застосовує два захисних правила під час виконання, які важливі, якщо права змінюються після запуску:

  • Плагін замінює вбудований переглядач (плагін заявляє розширення, яке також обробляє вбудований реєстр): при наявності ліцензованої можливості переглядач плагіна переважає; без неї Doconut тихо повертається до вбудованого переглядача. Користувачі все ще бачать документ — просто не отримують функціональність плагіна.
  • Формат лише для плагіна (наприклад .dcm — DICOM не має вбудованого переглядача): без необхідної можливості виклик відкриття завершується з помилкою:
text
LicenseException: This document type requires the 'Dicom' plugin license.

Активна Тимчасова ліцензія надає всі можливості (з чистим, без водяних знаків базовим переглядом). Це класичне джерело несподіванок під час запуску: реєстрація тих самих плагінів з купленою ліцензією, яка не включає одну з їх можливостей, призводить до помилки AddDoconut() під час запуску. Порівняйте IsCapabilityGranted(...) зі своїм планом перед розгортанням. З іншого боку: при відсутності будь‑якої ліцензії нічого не надається — відсутня ліцензія не є Тимчасовою ліцензією.

Те ж саме обмеження проявляється на клієнті: Viewer.ReferenceScripts() і ReferenceCss() генерують пакети скриптів/стилів для функцій, обмежених ліцензією (search, annotation, …) лише коли ліцензія їх дозволяє, тому інтерфейс віджету залишається узгодженим з тим, що реально виконує сервер.

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

У інтерфейсі продукту термін «плагін» використовується як широка мітка функції, але реєстрація на сервері відрізняється:

ФункціяЯк увімкненоCapabilityВносить
AnnotationВбудовано в переглядач; включає ресурси анотаційAnnotationАвторинг у браузері, збереження сеансу та експорт з вбудованими анотаціями
SearchВбудовано в переглядачі форматів з пошуком; включає ресурси пошуку та дозволяє витяг, коли це потрібноSearchРідний текстовий індекс, підсвічування та навігація результатами
ConverterВстановити Doconut.NET6.Converter і зареєструвати ConverterPluginConverterСлужба конвертації C# та додатковий веб‑віджет
DICOMВстановити Doconut.NET6.Dicom і зареєструвати DicomPluginDicomПерегляд медичних зображень для .dcm та .ima

Annotation та звичайний Search не використовують AddPlugin<TPlugin>(); їхні пакети генеруються лише коли ліцензія надає відповідну можливість. Converter і DICOM — це випущені плагіни‑реалізації IDoconutPlugin за вибором для цього набору документації.

У затверджених артефактах .NET 6 містяться Doconut.NET6.Converter і Doconut.NET6.Dicom тієї ж версії, що й основний пакет.

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

ПлагінПакетCapabilityВносить
ConverterDoconut.NET6.ConverterConverterМожливість конвертації документів
DICOMDoconut.NET6.DicomDicomПерегляд медичних зображень (.dcm — формат лише для плагіна)

Кожен має окрему сторінку в розділі Plugins з налаштуваннями та прикладами використання.

Кастомні переглядачі — ваш власний обробник форматів

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

text
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // implements IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // optional default config
});

Кастомні переглядачі мають пріоритет над усім — над вбудованими та над плагінами — і не підлягають обмеженню ліцензії (це ваш код). Фабрика повертається до ImageConfig, якщо ви не вказали конфігурацію за замовчуванням.

Висновки

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

Чи була ця сторінка корисною?