سیستم افزونه

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

هسته 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.NET6.Converter و ثبت ConverterPluginConverterسرویس تبدیل C# و ویجت وب اختیاری
DICOMنصب Doconut.NET6.Dicom و ثبت DicomPluginDicomنمایش تصویر پزشکی برای .dcm و .ima

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

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

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

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

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

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

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

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

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

نکات کلیدی

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

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