سیستم افزونه‌ها

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

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

قرارداد

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

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

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

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

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

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

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

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

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

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

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

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

text
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // implements IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // optional default config
});

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

نکات کلیدی

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

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