سیستم افزونه

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

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

این مدل در این نسخه جدید است. کتابخانه قبلی .NET Standard هیچ رجیستری افزونه نداشت: تبدیل در خود نمایشگر انجام می‌شد و لایسنس‌های افزونه از طریق فراخوانی‌های ثابت Viewer.SetLicensePlugin(...) نصب می‌شدند. هیچ‌یک از این‌ها مکانیزم ثبت‌نام در اینجا نیست.

ثبت‌نام یک افزونه

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

csharp
builder.Services.AddDoconut(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});

AddPlugin<TPlugin>() افزونه را نمونه‌سازی می‌کند و فراخوانی Register خود را در مقابل رجیستری افزونه که بر روی DoconutOptions نگهداری می‌شود، اجرا می‌کند. همهٔ آنچه افزونه اضافه می‌کند با قابلیت مورد نیاز افزونه برچسب‌گذاری می‌شود. AddDoconut() بلافاصله افزونه‌های ثبت‌شده را اعتبارسنجی می‌کند: لایسنس گمشده، فایل قدیمی TRIAL، یا لایسنس پرداختی بدون قابلیت، راه‌اندازی را با InvalidOperationException متوقف می‌کند. یک ثبت‌نام موقت/دمویی تا پس از انقضا حفظ می‌شود، اما قابلیت‌های زمان اجرا پس از تاریخ انقضا لغو می‌شوند.

قرارداد

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

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

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

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

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

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

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

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

آرتیفکت‌های تأییدشدهٔ .NET Standard شامل Doconut.NETStandard.Converter و Doconut.NETStandard.Dicom با همان نسخهٔ بستهٔ هسته هستند.

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

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

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

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

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

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

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

نکات کلیدی

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

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