מערכת תוספים
הרחבת הצופה עם תוספים
הליבה של Doconut נשארת רזה; פונקציונליות אופציונלית נשלחת כתוספים — חבילות NuGet נפרדות שתורמות צופים או שירותים ומופעלות על ידי הרישיון שלך. דף זה מסביר את מודל הרישום, איך הגבלת הרישיון פועלת בזמן ריצה, ואיך לחבר צופה משלך.
רישום תוסף
כל חבילת תוסף חושפת מחלקת תוסף אחת. אתה רושם אותה פעם אחת, באתחול:
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 נשמר לאחר תפוגה, אך היכולות שלו בזמן ריצה מבוטלות לאחר תאריך התפוגה.
החוזה
תוסף מממש ממשק קטן בכוונה:
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, …) רק כאשר הרישיון מאפשר אותן, כך שממשק הווידג'ט נשאר תואם למה שהשרת יעשה בפועל.
מפת תכונות ותוספים
ממשק המשתמש של המוצר משתמש במילה “plugin” כתווית תכונה רחבה, אך רישום השרת שונה:
| תכונה | איך זה מופעל | יכולת | תורם |
|---|---|---|---|
| Annotation | מובנה בצופה; כולל משאבי אנוטציה | Annotation | יצירת תוכן בדפדפן, שמירת מצב סשן, וייצוא משולב |
| Search | מובנה בצופי פורמטים הניתנים לחיפוש; כולל משאבי חיפוש ומאפשר חילוץ כשנדרש | Search | אינדקס טקסט מקורי, הדגשות, וניווט בתוצאות |
| Converter | התקן Doconut.NET6.Converter ורשום ConverterPlugin | Converter | שירות המרה ב‑C# וווידג'ט אינטרנטי אופציונלי |
| DICOM | התקן Doconut.NET6.Dicom ורשום DicomPlugin | Dicom | צפייה בתמונות רפואיות עבור .dcm ו‑.ima |
האנוטציה ו‑Search הרגיל אינם משתמשים ב‑AddPlugin<TPlugin>(); החבילות שלהם נשלחות רק כאשר הרישיון מעניק את היכולת המתאימה. Converter ו‑DICOM הם המימושים המופצים של IDoconutPlugin שניתן לבחור בהם עבור ערכת תיעוד זו.
הארטיפקטים המאושרים של .NET 6 מכילים את Doconut.NET6.Converter ו‑Doconut.NET6.Dicom באותה גרסה כמו חבילת הליבה.
חבילות תוספים משוחררות
| תוסף | חבילה | יכולת | תורם |
|---|---|---|---|
| Converter | Doconut.NET6.Converter | Converter | יכולת המרת מסמכים |
| DICOM | Doconut.NET6.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()— זכאות חסרה או בלתי מספקת שאינה Temporary גורמת לכשל מהיר. - תוספים בסגנון Override מתדרדרים בעדינות; פורמטים ייחודיים לתוסף נכשלים עם
LicenseException. - רישיון Temporary פעיל פותח את כל האפשרויות; בייצור נפתחות רק מה שרכשת. אמת עם
IDoconutLicenseServiceלפני השחרור.
האם דף זה היה מועיל?