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

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

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

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

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

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});
// Зареєстрований плагін, у якого відсутня ліцензія, викидає виключення тут, у Application_Start, і
// сайт потім відповідає на кожен запит порожнім 500. Причина знаходиться у журналі подій Windows.

AddPlugin<TPlugin>() створює плагін і дозволяє йому зареєструвати свої внески за допомогою DoconutOptions. Усе, що додає плагін, позначається необхідною можливістю плагіна, і DoconutHost.Initialize перевіряє кожен зареєстрований плагін щодо ліцензії перед тим, як сайт обробить свій перший запит.

Відсутня ліцензія на плагін зупиняє сайт

Коли жодна активна ліцензія не надає можливості зареєстрованого плагіна — жодної ліцензії, застарений файл TRIAL або платна ліцензія без цієї можливості — DoconutHost.Initialize генерує InvalidOperationException з Application_Start:

text
The Converter plugin is registered via AddPlugin but no active license grants Converter.
Remove the AddPlugin<...>() call or install a license (or trial/demo) that includes Converter.

У System.Web виключення у Application_Start не створює сторінку помилки. Кожен запит відповідає порожнім 500, журнал IIS не містить корисної інформації, а повідомлення з’являється лише у журналі подій Windows (журнал застосунків, джерело ASP.NET). Коли сайт перестає відповідати одразу після додавання рядка AddPlugin, спочатку перевірте файли ліцензії у wwwroot — див. Налаштування ліцензії.

Контракт

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

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

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

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

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

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

Анотація та Пошук не використовують AddPlugin<TPlugin>(). Конвертер і DICOM мають окрему сторінку у розділі Plugins з їхньою конфігурацією та використанням. У цьому пакеті DICOM відтворює сторінки, кадри та анімації, але не читає технічні метадані — дивіться Плагін DICOM.

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

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

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

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

Висновки

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

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