الترخيص
القدرات، مستويات الرخصة، وخدمة الرخصة
هذه الصفحة هي مرجع وقت التشغيل لكيفية تشكيل الرخصة لسلوك Doconut: ما يسمح به كل حالة رخصة، كيف تُمنح القدرات، وكيفية فحص كل ذلك من الشيفرة. (لـ تحميل رخصة، راجع البدء → إعداد الرخصة.)
حالات الرخصة وما تقوم به
| الحالة | يفتح المستندات؟ | علامة مائية | القدرات |
|---|---|---|---|
| رخصة كاملة (مدفوعة) (ضمن نافذة الاشتراك/التحديث الخاصة بها) | نعم | لا شيء | التي تم شراؤها (Has* flags) |
| رخصة مؤقتة (المطور/NFR — رخصة التقييم، قبل تاريخ انتهاء الصلاحية) | نعم | لا شيء | الكل — منحة شاملة (قمع التقييم) |
| منتهية (رخصة مؤقتة بعد تاريخ انتهاء صلاحيتها، أو اشتراك مدفوع بعد تاريخ تجديده) | نعم | علامة مائية للتقييم | لم يتم منح أي شيء |
| لا ملف رخصة على الإطلاق | نعم | علامة مائية للتقييم | لم يتم منح أي شيء |
| تم العثور عليها لكن تم رفضها (توقيع غير صالح، تم تعديلها، مدرجة في القائمة السوداء، أو بناء أحدث من نافذة إصدار الرخصة) | لا — LicenseException على كل فتح | — | — |
اثنان من العواقب التي تستحق الاستيعاب:
- الترخيص المفقود ليس رخصة مؤقتة. بدون ملف رخصة، تُظهر الصفحات علامة مائية ولا تكون أي قدرة (بحث، تعليقات، إضافات) نشطة. التجربة الكاملة غير المائية تتطلب رخصة مؤقتة حقيقية (احصل على واحدة).
- فقط الرخصة المرفوضة هي التي تمنع الفتح. انتهاء صلاحية التقويم/الاشتراك يتحول إلى عرض مائي؛ لكن نشر بناء أحدث من نافذة إصدار الرخصة يتم رفضه ويفشل بسرعة مع
LicenseException، لذا تلتقطه عند النشر — وليس عن طريق إرسال مخرجات مائية بصمت. ذلك الاستثناء (منOpenDocumentAsync) يحمل السبب منLicense.RejectionMessage.
القدرات
Doconut يتحكم في الوظائف الاختيارية عبر القدرة. اليوم هذه هي الإضافات القابلة للاختيار Converter و DICOM بالإضافة إلى ميزتي Search و Annotation المدمجتين، كل منها تُمنح حسب رخصتك. عارض الأساس ليس قدرة — إنه المتطلب المسبق، يُظهر كـ IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionالبوابة الوحيدة التي يستخدمها كامل خط الأنابيب هي IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);منطقه، حرفيًا من التنفيذ: رخصة مؤقتة نشطة (غير منتهية) تمنح كل قدرة — بما في ذلك القدرات التي لا تملك علم شراء مخصص بعد؛ رخصة مدفوعة حقيقية تمنح بالضبط أعلام Has* الخاصة بها وتكون الرفض الافتراضي لأي شيء غير مُعرّف. (ملف TRIAL قديم ليس استحقاقًا — يُعامل كغير مرخص: مائي، لا شيء ممنوح.)
الرخص المؤقتة
تُ标ًّى الرخص المؤقتة (المطور/غير تجاري) بواسطة علامة ExpiryNote وتحمل تاريخ انتهاء صلب:
| العضو | المعنى |
|---|---|
IsTemporary | وجود علامة ExpiryNote (الكشف يتم بوجود العلامة — لا يتم مطابقة نص الملاحظة، فهي ديناميكية) |
ExpiryNote | نص معلوماتي مضمّن في الرخصة |
LicenseExpiry | تاريخ الانتهاء الصلب (DateTime?) |
تختلف دلالات الانتهاء حسب الفئة: تنتهي الرخصة المؤقتة في تاريخ LicenseExpiry فقط (يُتجاهل نافذة الاشتراك الخاصة بها؛ رخصة مؤقتة بدون تاريخ تُعامل كمنتهية، آمنة). كل رخصة أخرى تنتهي في تاريخ نافذة الاشتراك/التحديث الخاصة بها.
مرجع IDoconutLicenseService
قم بحقن IDoconutLicenseService (المسار Doconut.Core.Interfaces; مسجل ككائن مفرد — تُحلل الرخصة مرة واحدة عند بدء التشغيل):
| العضو | المعنى |
|---|---|
License | لقطة كاملة من DoconutLicenseInfo (أدناه) |
IsTrial | ملف TRIAL قديم (يُعامل كغير مرخص — ليس استحقاقًا) |
IsTemporary / ExpiryNote / LicenseExpiry | علامات الرخصة المؤقتة |
IsExpired | منتهية وفق قواعد الفئة أعلاه |
IsVersionValid | هذا البناء يقع ضمن نافذة دعم الرخصة |
IsViewerLicensed | ملف غير TRIAL تم العثور عليه و تم تغطية الإصدار — المتطلب الأساسي |
IsCapabilityGranted(cap) | بوابة القدرة الوحيدة |
HasSearch HasAnnotation HasConverter HasDicom | مُصدرة وفق أعلام الشراء لكل قدرة — استخدم IsCapabilityGranted للحصول على إجابة تدرك المؤقت |
IsValidForDomain(host) | تغطية المضيف؛ رخص V4 تستخدم البدل *.* |
LicenseRejectionReason | غير فارغ ⇒ يتم حظر الفتح بهذه الرسالة |
DoconutLicenseInfo يُظهر لقطة صديقة للعرض للوحة الإدارة: Owner، Email، LicenseType، Domain، IsLicenseFileFound، IsVersionValid، IsTrial، IsExpired، أعلام Has*، حقول الرخصة المؤقتة، و RejectionMessage.
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}));فحص الصحة
AddDoconut() يسجل فحص صحة "doconut" الذي يُبلغ عن حالة الرخصة/الانتهاء عبر آلية ASP.NET Core القياسية:
app.MapHealthChecks("/health");اربطه بمراقبتك وسيصبح الاشتراك القريب من الانتهاء تنبيهًا بدلاً من تذكرة دعم.
ترقيات الإصدار
تغطي الرخصة نافذة إصدار. تحديث حزمة NuGet إلى بناء أحدث من تلك النافذة يجعل الرخصة غير صالحة لهذا البناء: يتحول IsVersionValid إلى false ويُحظر الفتح مع LicenseException (السبب في License.RejectionMessage) — فشل سريع مقصود، بحيث يُكتشف بناء قديم أو غير مرخص عند النشر بدلاً من وضع علامة مائية صامتة على مخرجات الإنتاج. جدد الاشتراك، استبدل ملف .lic، وأعد تشغيل التطبيق حتى يقوم AddDoconut() بتحميل الرخصة الجديدة.
هل كانت هذه الصفحة مفيدة؟