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