سیستم افزونهها
گسترش نمایشگر با افزونهها
هسته 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 متوقف میکند. ثبت موقت/دموی موقت تا تاریخ انقضا حفظ میشود، اما قابلیتهای زمان اجرا پس از تاریخ انقضا لغو میگردند.
قرارداد
یک افزونه یک رابط کاربری بهصورت عمدی کوچک پیادهسازی میکند:
public interface IDoconutPlugin
{
string Name { get; } // e.g. "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // the license gate
void Register(IDoconutPluginBuilder builder); // contribute viewers/services
}در داخل 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.یک لایسنس موقت فعال، تمام قابلیتها را اعطا میکند (با نمایش پایهٔ پاک و بدون واترمارک). این منبع کلاسیک شگفتیهای زمان راهاندازی است: ثبت همان افزونهها با لایسنس خریداریشده که یکی از قابلیتهایشان را حذف کرده است، باعث میشود AddDoconut() در زمان راهاندازی شکست بخورد. قبل از استقرار، IsCapabilityGranted(...) را با طرح خود مقایسه کنید. نکتهٔ مخالف: بدون هیچ لایسنس، هیچچیزی اعطا نمیشود — لایسنس گمشده، لایسنس موقت نیست.
همین محدودیت در سمت کاربر نیز دیده میشود: Viewer.ReferenceScripts() و ReferenceCss() بستههای اسکریپت/استایل مربوط به ویژگیهای محدود شده توسط لایسنس (جستجو، حاشیهنویسی، …) فقط زمانی که لایسنس آنها را فعال کند، تولید میکنند، بهطوری که رابط کاربری ویجت با آنچه سرور واقعاً انجام میدهد، همخوانی داشته باشد.
نقشه ویژگیها و افزونهها
رابط کاربری محصول از کلمهٔ “plugin” بهعنوان برچسب کلی ویژگی استفاده میکند، اما ثبت در سرور متفاوت است:
| ویژگی | چگونه فعال میشود | قابلیت | مشارکتها |
|---|---|---|---|
| Annotation | درون نمایشگر تعبیه شده؛ شامل منابع حاشیهنویسی | Annotation | نوشتن در مرورگر، حفظ نشست، و خروجیهای سوزاندهشده |
| Search | در نمایشگرهای فرمتهای قابل جستجو تعبیه شده؛ شامل منابع جستجو و فعالسازی استخراج در صورت نیاز | Search | ایندکس متن بومی، هایلایتها، و ناوبری نتایج |
| Converter | نصب Doconut.NET6.Converter و ثبت ConverterPlugin | Converter | سرویس تبدیل C# و ویجت وب اختیاری |
| DICOM | نصب Doconut.NET6.Dicom و ثبت DicomPlugin | Dicom | مشاهدهٔ تصاویر پزشکی برای .dcm و .ima |
حاشیهنویسی و جستجوی معمولی از AddPlugin<TPlugin>() استفاده نمیکنند؛ بستههای آنها فقط زمانی صادر میشوند که لایسنس قابلیت مربوطه را اعطا کند. Converter و DICOM پیادهسازیهای منتشرشدهٔ IDoconutPlugin برای این مجموعهٔ مستندات هستند.
آرتیفکتهای تأییدشدهٔ .NET 6 شامل Doconut.NET6.Converter و Doconut.NET6.Dicom با همان نسخهٔ بستهٔ هسته هستند.
بستههای افزونه منتشر شده
| افزونه | بسته | قابلیت | مشارکتها |
|---|---|---|---|
| Converter | Doconut.NET6.Converter | Converter | قابلیت تبدیل اسناد |
| DICOM | Doconut.NET6.Dicom | Dicom | مشاهدهٔ تصویر پزشکی (.dcm — فرمت فقط برای افزونه) |
هر یک صفحهٔ اختصاصی خود را تحت Plugins دارند که شامل پیکربندی و نحوهٔ استفاده هستند.
نمایشگرهای سفارشی — پردازشگر فرمت خودتان
میتوانید یک نمایشگر را بدون نوشتن بستهٔ افزونه، مستقیماً از Program.cs به خط لوله اضافه کنید:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // implements IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // optional default config
});نمایشگرهای سفارشی بر همه چیز — داخلیها و افزونهها — اولویت دارند و تحت محدودیت لایسنس نیستند (کد شما هستند). کارخانه در صورت عدم ارائهٔ پیکربندی پیشفرض، به یک ImageConfig پیشفرض بازمیگردد.
نکات کلیدی
- افزونهها بهصورت صریح ثبت میشوند و
LicenseCapabilityآنها در زمانAddDoconut()اعتبارسنجی میشود — عدم وجود یا ناکافی بودن حقالامتیاز غیرموقت، بلافاصله متوقف میشود. - افزونههای نوع بازنویسی بهصورت Graceful عمل میکنند؛ فرمتهای فقط‑افزونهای با
LicenseExceptionشکست میخورند. - یک لایسنس موقت فعال همه چیز را باز میکند؛ لایسنس تولیدی فقط آنچه خریداری کردهاید را باز میکند. پیش از انتشار، با
IDoconutLicenseServiceتأیید کنید.
آیا این صفحه مفید بود؟