מערכת תוספים

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

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

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

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

תכונהאיך זה מופעליכולתתורם
אנוטציהמובנה בצופה; כולל משאבי אנוטציה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 לפני השחרור.

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