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

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

Ядро Doconut залишається легким; додаткова функціональність постачається у вигляді плагінів — окремих пакетів 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(extension, factory) — переглядач для розширення файлу; фабрика повертає IFormatViewer (плагін DICOM реєструє .dcm та .ima таким чином),
  • 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 — це випущені реалізації 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 перед випуском.

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