نظام الإضافات

توسيع عارض المستندات باستخدام الإضافات

نواة 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 هما تنفيذات IDoconutPlugin الاختيارية المُصدرة لهذه مجموعة الوثائق.

تحتوي القطع المصدقة .NET 6 على Doconut.NET6.Converter و Doconut.NET6.Dicom بنفس نسخة الحزمة الأساسية.

حزم الإضافات المُصدرة

الإضافةالحزمةالقدرةيساهم
المحولDoconut.NET6.ConverterConverterقدرة تحويل المستند
DICOMDoconut.NET6.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 قبل الإرسال.

هل كانت هذه الصفحة مفيدة؟