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

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

Ядро Doconut залишається легким; додаткова функціональність постачається у вигляді plugins — окремих пакетів NuGet, які додають переглядачі або сервіси і активуються вашою ліцензією. На цій сторінці пояснюється модель реєстрації, як працює обмеження ліцензії під час виконання, і як підключити власний переглядач.

Ця модель нова у цьому випуску. Попередня бібліотека .NET Standard не мала реєстру плагінів: конвертація була вбудована в сам переглядач, а ліцензії плагінів встановлювалися через статичні виклики Viewer.SetLicensePlugin(...). Жоден з цих підходів не є механізмом реєстрації тут.

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

Кожен пакет плагіна надає один клас плагіна. Ви реєструєте його один раз під час запуску:

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 не має вбудованого переглядача): без можливості виклик відкриття завершується з помилкою:
text
LicenseException: This document type requires the 'Dicom' plugin license.

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

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

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

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

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

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

Схвалені артефакти .NET Standard містять Doconut.NETStandard.Converter та Doconut.NETStandard.Dicom тієї ж версії, що й основний пакет.

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

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

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

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

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

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

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

Висновки

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

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