سیستم افزونه

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

هستهٔ Doconut ساده می‌ماند؛ عملکردهای اختیاری به‌صورت افزونه‌ها — بسته‌های جداگانهٔ NuGet که نمایشگرها یا سرویس‌ها را اضافه می‌کنند و توسط لایسنس شما فعال می‌شوند. این صفحه مدل ثبت‌نام، نحوهٔ رفتار محدودیت لایسنس در زمان اجرا، و چگونگی افزودن نمایشگر خودتان را توضیح می‌دهد.

ثبت یک افزونه

هر بستهٔ افزونه یک کلاس افزونه را افشا می‌کند. شما آن را یک‌بار، در زمان راه‌اندازی، ثبت می‌کنید:

csharp
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 تا پس از انقضا حفظ می‌شود، اما قابلیت‌های زمان اجرا پس از تاریخ انقضا لغو می‌شوند.

قرارداد

یک افزونه یک رابط کاربری به‌طور عمدی کوچک را پیاده‌سازی می‌کند:

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 — DICOM نمایشگر داخلی ندارد): بدون داشتن قابلیت، فراخوانی باز کردن به‌صورت سخت‌گیرانه شکست می‌خورد:
text
LicenseException: This document type requires the 'Dicom' plugin license.

یک لایسنس Temporary فعال تمام قابلیت‌ها را اعطا می‌کند (با نمایش پایهٔ پاک و بدون واترمارک). این یک منبع کلاسیک از شگفتی‌های راه‌اندازی است: ثبت همان افزونه‌ها با لایسنس خریداری‌شده که یکی از قابلیت‌های آن‌ها را حذف کرده است، باعث می‌شود AddDoconut() در زمان راه‌اندازی شکست بخورد. قبل از استقرار، IsCapabilityGranted(...) را با برنامهٔ خود مقایسه کنید. طرف دیگر: با بدون هیچ لایسنس، هیچ چیزی اعطا نمی‌شود — یک لایسنس گمشده لایسنس Temporary نیست.

همین محدودیت در سمت کلاینت نیز ظاهر می‌شود: Viewer.ReferenceScripts() و ReferenceCss() بسته‌های اسکریپت/استایل مربوط به ویژگی‌های محدود شده توسط لایسنس (جستجو، حاشیه‌نویسی، …) را فقط زمانی که لایسنس آن‌ها را فعال می‌کند، صادر می‌کنند، بنابراین رابط کاربری ویجت با آنچه سرور در واقع انجام می‌دهد سازگار می‌ماند.

نقشهٔ ویژگی‌ها و افزونه‌ها

رابط کاربری محصول از «افزونه» به‌عنوان برچسبی گسترده برای ویژگی استفاده می‌کند، اما ثبت‌نام سرور متفاوت است:

ویژگیچگونه فعال می‌شودقابلیتمشارکت می‌کند
حاشیه‌نویسیدرون نمایشگر تعبیه شده؛ شامل منابع حاشیه‌نویسیAnnotationنویسندگی مرورگر، حفظ نشست، و خروجی‌های سوزانده‌شده
جستجودرون نمایشگرهای فرمت‌های قابل جستجو تعبیه شده؛ شامل منابع جستجو و فعال‌سازی استخراج در صورت نیازSearchفهرست متن بومی، هایلایت‌ها، و ناوبری نتایج
مبدلنصب Doconut.NET8.Converter و ثبت ConverterPluginConverterسرویس تبدیل C# و ویجت وب اختیاری
DICOMنصب Doconut.NET8.Dicom و ثبت DicomPluginDicomنمایش تصویر پزشکی برای .dcm و .ima

حاشیه‌نویسی و جستجوی معمولی از AddPlugin<TPlugin>() استفاده نمی‌کنند؛ بسته‌های آن‌ها فقط زمانی صادر می‌شوند که لایسنس قابلیت مربوطه را اعطا کند. مبدل‌کننده و DICOM پیاده‌سازی‌های opt-in IDoconutPlugin هستند.

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

افزونهبستهقابلیتمشارکت می‌کند
مبدلDoconut.NET8.ConverterConverterقابلیت تبدیل سند
DICOMDoconut.NET8.DicomDicomنمایش تصویر پزشکی (.dcm — قالب فقط افزونه‌ای)

هر کدام صفحهٔ اختصاصی تحت افزونه‌ها دارند که شامل پیکربندی و استفادهٔ آن است.

نمایشگرهای سفارشی — پردازشگر فرمت خودتان

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

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

نمایشگرهای سفارشی بر همه — داخلی‌ها و افزونه‌ها — اولویت دارند و محدود به لایسنس نیستند (آن‌ها کد شما هستند). کارخانه در صورت عدم ارائهٔ پیکربندی پیش‌فرض به یک ImageConfig بازمی‌گردد.

نکات کلیدی

  • افزونه‌ها به‌صورت صریح ثبت می‌شوند و LicenseCapability آن‌ها در طول AddDoconut() اعتبارسنجی می‌شود — فقدان یا ناکافی بودن حق‌الامتیاز غیر موقت به‌سرعت شکست می‌خورد.
  • افزونه‌های سبک بازنویسی به‌صورت ملایم کاهش می‌یابند؛ قالب‌های فقط افزونه‌ای با یک LicenseException شکست می‌خورند.
  • یک لایسنس Temporary فعال همه چیز را باز می‌کند؛ لایسنس تولید آنچه خریداری کرده‌اید را باز می‌کند. قبل از ارسال، با IDoconutLicenseService تأیید کنید.

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