سیستم افزونهها
گسترش نمایشگر با افزونهها
هسته Doconut ساده باقی میماند؛ عملکردهای اختیاری به صورت افزونهها — بستههای جداگانه NuGet که نمایشگرها یا سرویسها را اضافه میکنند و توسط مجوز شما فعال میشوند. این صفحه مدل ثبت را توضیح میدهد، چه اتفاقی در زمان راهاندازی میافتد وقتی مجوزی یک افزونه را پوشش نمیدهد، و چگونه میتوانید نمایشگر خود را اضافه کنید.
ثبت یک افزونه
هر بسته افزونه یک کلاس افزونه را ارائه میدهد. یکبار آن را در Application_Start ثبت کنید:
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 پرتاب میکند:
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 بررسی کنید — به پیکربندی مجوز مراجعه کنید.
قرارداد
یک افزونه یک رابط کاربری بهطور عمدی کوچک را پیادهسازی میکند:
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 نمایشگر داخلی ندارد): بدون قابلیت، باز کردن شکست میخورد:
LicenseException: This document type requires the 'Dicom' plugin license.یک مجوز موقت فعال تمام قابلیتها را اعطا میکند. این یک سورپرایز کلاسیک هنگام راهاندازی است: همان خطوط AddPlugin که در دورهٔ ارزیابی اجرا میشدند، وقتی مجوز خریداریشده یکی از آن قابلیتها را حذف میکند، سایت را متوقف میکند. IsCapabilityGranted(...) را با آنچه قبل از استقرار خریداری کردهاید مقایسه کنید. با عدم وجود هیچ مجوزی، هیچچیزی اعطا نمیشود — یک مجوز گمشده، یک مجوز موقت نیست.
همین محدودسازی به مرورگر نیز میرسد: Viewer.ReferenceScripts() و ReferenceCss() فایلهای مربوط به ویژگیهای محدودشده توسط مجوز (جستجو، حاشیهنویسی) را فقط زمانی که مجوز آنها را اعطا میکند، منتشر میکنند، بنابراین صفحه هرگز ویژگیای را که سرور رد میکند، ارائه نمیدهد.
نقشهٔ ویژگیها و افزونهها
| ویژگی | چگونه فعال میشود | قابلیت | مشارکتها |
|---|---|---|---|
| حاشیهنویسی | درون نمایشگر تعبیه شده؛ شامل منابع حاشیهنویسی | Annotation | مرورگر نویسندگی، حفظ نشست، خروجیهای سوزاندهشده |
| جستجو | درون نمایشگرهای فرمتهای قابل جستجو تعبیه شده؛ شامل منابع جستجو | Search | فهرست متن بومی، هایلایتها، ناوبری نتایج |
| مبدل | نصب Doconut.NETFramework.Converter و ثبت ConverterPlugin | Converter | سرویس تبدیل C# و یک ویجت وب اختیاری |
| DICOM | نصب Doconut.NETFramework.Dicom و ثبت DicomPlugin | Dicom | نمایش تصویر پزشکی برای .dcm و .ima |
حاشیهنویسی و جستجو از AddPlugin<TPlugin>() استفاده نمیکنند. مبدل و DICOM هر کدام صفحهای تحت افزونهها دارند که شامل پیکربندی و استفاده آنهاست. در این بسته، DICOM صفحات، فریمها و انیمیشنها را رندر میکند، اما متادیتای فنی را نمیخواند — به افزونه DICOM مراجعه کنید.
نمایشگرهای سفارشی — مدیریت قالب خودتان
میتوانید یک نمایشگر را بدون نوشتن بستهٔ افزونه، مستقیماً در Application_Start به خط لوله وصل کنید:
Doconut.DoconutHost.Initialize(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // پیادهسازی IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // پیکربندی پیشفرض اختیاری
});نمایشگرهای سفارشی بر همه چیز — هم داخلیها و هم افزونهها — اولویت دارند و تحت محدودسازی مجوز نیستند: آنها کد شما هستند. وقتی پیکربندی پیشفرضی فراهم نمیکنید، کارخانه از یک ImageConfig استفاده میکند.
نکات کلیدی
- افزونهها بهصورت صریح در
DoconutHost.Initializeثبت میشوند و قابلیتهای آنها در همانجا اعتبارسنجی میشود؛ یک حقالزحمهٔ گمشده سایت را با یک500خالی که دلیل آن در لاگ رویداد ویندوز است، متوقف میکند. - افزونههای سبک بازنویسی بهصورت ملایم کاهش عملکرد میدهند؛ قالبهای فقط افزونهای با یک
LicenseExceptionشکست میخورند. - یک مجوز موقت فعال همه چیز را باز میکند؛ نسخهٔ تولید آنچه خریداری کردهاید را باز میکند. قبل از انتشار با
IDoconutLicenseServiceبررسی کنید.
آیا این صفحه مفید بود؟