سیستم افزونه
گسترش نمایشگر با افزونهها
هسته Doconut ساده باقی میماند؛ قابلیتهای اختیاری بهصورت افزونهها — بستههای جداگانه NuGet که نمایشگرها یا سرویسها را اضافه میکنند و توسط لایسنس شما فعال میشوند. این صفحه مدل ثبتنام، نحوه رفتار محدودیت لایسنس در زمان اجرا، و چگونگی افزودن نمایشگر خودتان را توضیح میدهد.
این مدل در این نسخه جدید است. کتابخانه قبلی .NET Standard هیچ رجیستری افزونه نداشت: تبدیل در خود نمایشگر انجام میشد و لایسنسهای افزونه از طریق فراخوانیهای ثابت Viewer.SetLicensePlugin(...) نصب میشدند. هیچیک از اینها مکانیزم ثبتنام در اینجا نیست.
ثبتنام یک افزونه
هر بسته افزونه یک کلاس افزونه را افشا میکند. شما آن را یکبار، در زمان راهاندازی ثبت میکنید:
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; } // مثلاً "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // دروازهٔ مجوز
void Register(IDoconutPluginBuilder builder); // مشارکت در نمایشگرها/سرویسها
}در داخل Register، سازنده دو نوع مشارکت را میپذیرد:
builder.RegisterViewer(extension, factory)— یک نمایشگر برای پسوند فایل؛ کارخانه یکIFormatViewerبرمیگرداند (افزونه DICOM به این روش.dcmو.imaرا ثبت میکند)،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() بستههای اسکریپت/استایل را برای ویژگیهای محدود شده توسط لایسنس (جستجو، حاشیهنویسی، …) فقط زمانی که لایسنس آنها را فعال میکند، تولید میکنند، بنابراین رابط کاربری ویجت با آنچه سرور واقعاً انجام میدهد، سازگار میماند.
نقشه ویژگیها و افزونهها
رابط کاربری محصول از «افزونه» بهعنوان برچسب ویژگی گسترده استفاده میکند، اما ثبتنام سرور متفاوت است:
| ویژگی | نحوهٔ فعالسازی | قابلیت | مشارکت |
|---|---|---|---|
| حاشیهنویسی | درون نمایشگر تعبیه شده؛ شامل منابع حاشیهنویسی | Annotation | نویسندگی مرورگر، حفظ نشست، و خروجیهای سوزاندهشده |
| جستجو | درون نمایشگرهای فرمت قابل جستجو تعبیه شده؛ شامل منابع جستجو و فعالسازی استخراج در صورت نیاز | Search | فهرست متن بومی، برجستهسازیها، و ناوبری نتایج |
| مبدل | نصب Doconut.NETStandard.Converter و ثبت ConverterPlugin | Converter | سرویس تبدیل C# و ویجت وب اختیاری |
| DICOM | نصب Doconut.NETStandard.Dicom و ثبت DicomPlugin | Dicom | نمایش تصویر پزشکی برای .dcm و .ima |
حاشیهنویسی و جستجوی معمولی از AddPlugin<TPlugin>() استفاده نمیکنند؛ بستههای آنها فقط زمانی تولید میشوند که لایسنس قابلیت مربوطه را اعطا کند. مبدل و DICOM پیادهسازیهای opt‑in منتشرشدهٔ IDoconutPlugin برای این مجموعه مستندات هستند.
آرتیفکتهای تأییدشدهٔ .NET Standard شامل Doconut.NETStandard.Converter و Doconut.NETStandard.Dicom با همان نسخهٔ بستهٔ هسته هستند.
بستههای افزونهٔ منتشرشده
| افزونه | بسته | قابلیت | مشارکت |
|---|---|---|---|
| مبدل | Doconut.NETStandard.Converter | Converter | قابلیت تبدیل سند |
| DICOM | Doconut.NETStandard.Dicom | Dicom | نمایش تصویر پزشکی (.dcm — قالب فقط-افزونهای) |
هر کدام صفحهٔ اختصاصی خود را تحت افزونهها دارند که شامل پیکربندی و استفاده است.
نمایشگرهای سفارشی — پردازشگر قالب خودتان
میتوانید یک نمایشگر را به خط لوله متصل کنید بدون نوشتن بستهٔ افزونه، مستقیم از Program.cs:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // پیادهسازی IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // پیکربندی پیشفرض اختیاری
});نمایشگرهای سفارشی بر همه چیز — داخلیها و افزونهها — اولویت دارند و تحت محدودیت لایسنس نیستند (آنها کد شما هستند). کارخانه در صورت عدم ارائهٔ پیکربندی پیشفرض به یک ImageConfig بازمیگردد.
نکات کلیدی
- افزونهها بهصورت صریح ثبت میشوند و
LicenseCapabilityآنها در طولAddDoconut()اعتبارسنجی میشود — فقدان یا ناتوانی غیرموقت سریعاً شکست میخورد. - افزونههای سبک بازنویسی بهصورت ملایم کاهش مییابند؛ قالبهای فقط-افزونهای با یک
LicenseExceptionشکست میخورند. - یک لایسنس موقت فعال همه چیز را باز میکند؛ لایسنس تولید آنچه خریداری کردهاید را باز میکند. قبل از انتشار با
IDoconutLicenseServiceتأیید کنید.
آیا این صفحه مفید بود؟