מערכת תוספים

הרחבת הצופה עם תוספים

הליבה של Doconut נשארת רזה; פונקציונליות אופציונלית נשלחת כ‑plugins — חבילות NuGet נפרדות שתורמות צופים או שירותים ומופעלות על‑ידי הרישיון שלך. דף זה מסביר את מודל הרישום, איך הגבלת הרישיון מתנהלת בזמן ריצה, וכיצד לחבר צופה משלך.

מודל זה חדש בגרסה זו. ספריית .NET Standard הקודמת לא הייתה כוללת רישום תוספים: ההמרה הייתה חלק מהצופה עצמו והרישיונות לתוספים הותקנו באמצעות קריאות סטטיות של Viewer.SetLicensePlugin(...). אף אחת מהן אינה מנגנון רישום כאן.

רישום תוסף

כל חבילת תוסף חושפת מחלקת תוסף אחת. אתה רושם אותה פעם אחת, באתחול:

csharp
builder.Services.AddDoconut(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});

AddPlugin<TPlugin>() יוצר מופע של התוסף וקורא את ה‑callback Register שלו כנגד רישום התוספים שנמצא ב‑DoconutOptions. כל מה שתוסף תורם מתוייג עם required capability של התוסף. AddDoconut() מאמת תוספים רשומים מיידית: רישיון חסר, קובץ legacy של TRIAL, או רישיון בתשלום ללא היכולת גורמים לכשל באתחול עם InvalidOperationException. רישום Temporary/Demo נשמר לאחר תפוגה, אך היכולות שלו בזמן ריצה מבוטלות לאחר תאריך התפוגה.

החוזה

תוסף מממש ממשק קטן במכוון:

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // למשל "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // שער הרישיון
    void Register(IDoconutPluginBuilder builder); // תרום צופים/שירותים
}

בתוך Register, הבונה מקבל שני סוגים של תרומות:

  • builder.RegisterViewer(extension, factory) — צופה עבור סיומת קובץ; הפקטורייה מחזירה IFormatViewer (תוסף DICOM רושם .dcm ו‑.ima בדרך זו),
  • builder.RegisterService<TContract>(() => …) — שירות Typed שהחלקים האחרים של הצינור יכולים לחפש.

יכולות והגבלה

יכולות הן יחידות הרישיון. 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() מפיקים את חבילות הסקריפט/סגנון לתכונות המוגבלות ברישיון (חיפוש, הערה, …) רק כאשר הרישיון מאפשר אותן, כך שממשק ה‑widget נשאר תואם למה שהשרת בפועל יעשה.

מפת תכונות ותוספים

תכונהאיך זה מופעליכולתתורם
Annotationמשולב בצופה; כולל משאבי הערהAnnotationעריכת דפדפן, שמירת מושב, וייצוא עם חיבור ההערה
Searchמשולב בצופי פורמטים הניתנים לחיפוש; כולל משאבי חיפוש ומאפשר חילוץ כשנדרשSearchאינדקס טקסט מקורי, הדגשות, וניווט בתוצאות
ConverterInstall Doconut.NETStandard.Converter and register ConverterPluginConverterשירות המרת C# ווידג׳ט אינטרנטי אופציונלי
DICOMInstall Doconut.NETStandard.Dicom and register DicomPluginDicomצפייה בתמונות רפואיות עבור .dcm ו‑.ima

הערה וחיפוש רגילים אינם משתמשים ב‑AddPlugin<TPlugin>(); החבילות שלהם נשלחות רק כאשר הרישיון מעניק את היכולת המתאימה. ממיר ו‑DICOM הם ה‑IDoconutPlugin האופציונליים שהושקו עבור ערכת תיעוד זו.

הארטיפקטים המאושרים של .NET Standard מכילים Doconut.NETStandard.Converter ו‑Doconut.NETStandard.Dicom באותה גרסה כמו חבילת הליבה.

חבילות תוסף משוחררות

תוסףחבילהיכולתתורם
ConverterDoconut.NETStandard.ConverterConverterDocument conversion capability
DICOMDoconut.NETStandard.DicomDicomMedical‑image viewing (.dcm — plugin‑only format)

לכל אחד יש דף ייעודי תחת Plugins עם ההגדרות והשימוש שלו.

צופים מותאמים — מטפל בפורמט שלך

אתה יכול לחבר צופה לצינור ללא כתיבת חבילת תוסף, ישירות מ‑Program.cs:

csharp
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // מיישם IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // קונפיגורציה ברירת מחדל אופציונלית
});

צופים מותאמים מקבלים עדיפות על everything — מובנים ותוספים כאחד — ואינם מוגבלים ברישיון (הם הקוד שלך). הפקטורייה חוזרת ל‑ImageConfig כאשר אינך מספק תצורת ברירת מחדל.

מסקנות

  • תוספים נרשמים במפורש וה‑LicenseCapability שלהם מאומת במהלך ה‑AddDoconut() — רישיון חסר או בלתי מספיק שאינו זמני גורם לכשל מהיר.
  • תוספים בסגנון Override מתנהגים בעדינות; פורמטים ייחודיים לתוסף נכשלות עם LicenseException.
  • רישיון Temporary פעיל פותח את כל האפשרויות; רישיון ייצור פותח רק את מה שנרכש. אמת עם IDoconutLicenseService לפני השחרור.

האם דף זה היה מועיל?