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