سیستم افزونه‌ها

گسترش نمایشگر با افزونه‌ها

هسته 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 هیچ اطلاعات مفیدی نشان نمی‌دهد، و پیام فقط در لاگ رویداد ویندوز (لاگ برنامه، منبع 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 هر کدام صفحه‌ای تحت افزونه‌ها دارند که شامل پیکربندی و استفاده آن‌هاست. در این بسته، DICOM صفحات، فریم‌ها و انیمیشن‌ها را رندر می‌کند، اما متادیتای فنی را نمی‌خواند — به افزونه DICOM مراجعه کنید.

نمایشگرهای سفارشی — مدیریت قالب خودتان

می‌توانید یک نمایشگر را بدون نوشتن بستهٔ افزونه، مستقیماً در Application_Start به خط لوله وصل کنید:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),                        // پیاده‌سازی IFormatViewer
        () => new ImageConfig { ImageResolution = 150 });  // پیکربندی پیش‌فرض اختیاری
});

نمایشگرهای سفارشی بر همه چیز — هم داخلی‌ها و هم افزونه‌ها — اولویت دارند و تحت محدودسازی مجوز نیستند: آن‌ها کد شما هستند. وقتی پیکربندی پیش‌فرضی فراهم نمی‌کنید، کارخانه از یک ImageConfig استفاده می‌کند.

نکات کلیدی

  • افزونه‌ها به‌صورت صریح در DoconutHost.Initialize ثبت می‌شوند و قابلیت‌های آن‌ها در همانجا اعتبارسنجی می‌شود؛ یک حق‌الزحمهٔ گمشده سایت را با یک 500 خالی که دلیل آن در لاگ رویداد ویندوز است، متوقف می‌کند.
  • افزونه‌های سبک بازنویسی به‌صورت ملایم کاهش عملکرد می‌دهند؛ قالب‌های فقط افزونه‌ای با یک LicenseException شکست می‌خورند.
  • یک مجوز موقت فعال همه چیز را باز می‌کند؛ نسخهٔ تولید آنچه خریداری کرده‌اید را باز می‌کند. قبل از انتشار با IDoconutLicenseService بررسی کنید.

آیا این صفحه مفید بود؟