מערכת תוספים

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

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

רישום תוסף

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

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

AddPlugin<TPlugin>() יוצר מופע של התוסף וקורא ל‑callback 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.

רישיון Temporary פעיל מעניק כל יכולת (עם צפייה בסיסית נקייה, ללא סימון מים). זהו מקור קלאסי להפתעות בזמן השקה: רישום אותם תוספים עם רישיון שנרכש ושלא כולל אחת מהיכולות שלהם גורם ל‑AddDoconut() להיכשל באתחול. השווה IsCapabilityGranted(...) לתוכנית שלך לפני הפריסה. הצד השני: עם אין רישיון כלל, שום דבר אינו ניתנת — רישיון חסר אינו רישיון Temporary.

ההגבלה זהה בצד הלקוח: Viewer.ReferenceScripts() ו‑ReferenceCss() מפיקים את חבילות הסקריפט/סגנון עבור תכונות המוגבלות ברישיון (search, annotation, …) רק כאשר הרישיון מאפשר אותן, כך שממשק הווידג'ט נשאר תואם למה שהשרת יעשה בפועל.

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

ממשק המשתמש של המוצר משתמש במילה “plugin” כתווית תכונה רחבה, אך רישום השרת שונה:

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

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

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

חבילות תוספים משוחררות

תוסףחבילהיכולתתורם
ConverterDoconut.NET6.ConverterConverterיכולת המרת מסמכים
DICOMDoconut.NET6.DicomDicomצפייה בתמונות רפואיות (.dcm — פורמט ייחודי לתוסף)

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

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

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

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

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

מסקנות

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

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