سیستم افزونه

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

هسته 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); // مشارکت در viewers/services
}

در داخل 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.

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

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

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

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

ویژگیچگونه فعال می‌شودقابلیتمشارکت می‌کند
حاشیه‌نویسیدرون نمایشگر تعبیه شده؛ شامل منابع حاشیه‌نویسی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 — فرمت فقط افزونه‌ای)

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

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

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

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

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

نکات کلیدی

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

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