מערכת תוספים
הרחבת הצופה עם תוספים
הליבה של Doconut נשארת רזה; פונקציונליות אופציונלית מגיעה כתוספים — חבילות NuGet נפרדות שתורמות מציגים או שירותים ומופעלות על ידי הרישיון שלך. דף זה מסביר את מודל הרישום, כיצד מתנהגת הגבלת הרישיון בזמן ריצה, וכיצד לחבר מציג משלך.
רישום תוסף
כל חבילת תוסף חושפת מחלקת תוסף אחת. אתה רושם אותה פעם אחת, בזמן האתחול:
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 נשמר לאחר תפוגה, אך היכולות שלו בזמן ריצה מבוטלות לאחר תאריך התפוגה.
החוזה
תוסף מממש ממשק קטן במכוון:
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 אין מציג מובנה): ללא היכולת קריאת הפתיחה נכשלת בחומרה:
LicenseException: This document type requires the 'Dicom' plugin license.רישיון Temporary פעיל מעניק כל יכולת (עם צפייה בסיסית נקייה, ללא סימון מים). זהו מקור קלאסי להפתעות בעת ההשקה: רישום אותם תוספים עם רישיון שנרכש ושאינו כולל אחת מהיכולות שלהם גורם ל-AddDoconut() להיכשל בזמן האתחול. השווה IsCapabilityGranted(...) לתוכנית שלך לפני הפריסה. הצד השני: עם אין רישיון כלל, שום דבר אינו ניתנת — רישיון חסר אינו רישיון Temporary.
ההגבלה זהה בצד הלקוח: Viewer.ReferenceScripts() ו-ReferenceCss() מפיקים את חבילות הסקריפט/סגנון לתכונות המוגבלות ברישיון (search, annotation, …) רק כאשר הרישיון מאפשר אותן, כך שממשק הווידג'ט נשאר תואם למה שהשרת יעשה בפועל.
מפת תכונות ותוספים
המוצר UI משתמש במילה “plugin” כתווית תכונה רחבה, אך רישום השרת שונה:
| תכונה | איך זה מופעל | יכולת | תורם |
|---|---|---|---|
| Annotation | מובנה במציג; כולל משאבי אנוטציה | Annotation | עריכה בדפדפן, שמירת מצב, וייצוא משולב |
| Search | מובנה במציגי פורמטים ניתנים לחיפוש; כולל משאבי חיפוש ומאפשר חילוץ כשנדרש | Search | אינדקס טקסט מקורי, הדגשות, וניווט בתוצאות |
| Converter | התקן Doconut.NET8.Converter ורשום ConverterPlugin | Converter | שירות המרה ב‑C# ווידג'ט אינטרנטי אופציונלי |
| DICOM | התקן Doconut.NET8.Dicom ורשום DicomPlugin | Dicom | צפייה בתמונות רפואיות עבור .dcm ו‑.ima |
חבילות תוספים שפורסמו
| תוסף | חבילה | יכולת | תורם |
|---|---|---|---|
| Converter | Doconut.NET8.Converter | Converter | יכולת המרת מסמכים |
| DICOM | Doconut.NET8.Dicom | Dicom | צפייה בתמונות רפואיות (.dcm — פורמט ייחודי לתוסף) |
לכל אחד יש דף ייעודי תחת תוספים עם ההגדרות והשימוש שלו.
מציגים מותאמים — מטפל בפורמט שלך
אתה יכול לחבר מציג לצינור ללא כתיבת חבילת תוסף, ישירות מ-Program.cs:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // implements IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // optional default config
});מציגים מותאמים מקבלים עדיפות על הכל — מובנים ותוספים כאחד — ואינם מוגבלים ברישיון (הם הקוד שלך). המפעל חוזר ל-ImageConfig כאשר אינך מספק תצורת ברירת מחדל.
מסקנות
- תוספים נרשמים במפורש וה-
LicenseCapabilityשלהם מאומת במהלךAddDoconut()— חסר או זכאות לא זמנית בלתי מספיקה גורמת לכשל מהיר. - תוספי סגנון הצפה מתדרדרים בחן; פורמטים ייחודיים לתוסף נכשלים עם
LicenseException. - רישיון Temporary פעיל פותח את כל האפשרויות; בייצור נפתחות רק מה שרכשת. אמת עם
IDoconutLicenseServiceלפני השחרור.
האם דף זה היה מועיל?