Σύστημα Προσθηκών
Επεκτείνετε τον προβολέα με προσθήκες
Ο πυρήνας του Doconut παραμένει ελαφρύς· η προαιρετική λειτουργικότητα παρέχεται ως plugins — ξεχωριστά πακέτα NuGet που συνεισφέρουν προβολείς ή υπηρεσίες και ενεργοποιούνται από την άδειά σας. Αυτή η σελίδα εξηγεί το μοντέλο καταχώρισης, πώς ο περιορισμός άδειας συμπεριφέρεται σε χρόνο εκτέλεσης και πώς να ενσωματώσετε τον δικό σας προβολέα.
Registering a plugin
Κάθε πακέτο plugin εκθέτει μία κλάση plugin. Την καταχωρίζετε μία φορά, κατά την εκκίνηση:
builder.Services.AddDoconut(options =>
{
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});AddPlugin<TPlugin>() δημιουργεί το plugin και καλεί την Register callback του ενάντια στο μητρώο plugin που διατηρείται στο DoconutOptions. Ό,τι συνεισφέρει ένα plugin επισημαίνεται με την απαιτούμενη δυνατότητα του plugin. AddDoconut() επικυρώνει άμεσα τα καταχωρημένα plugins: μια ελλιπής άδεια, αρχείο legacy TRIAL, ή πληρωμένη άδεια χωρίς την δυνατότητα αποτυγχάνει την εκκίνηση με InvalidOperationException. Μια εγγραφή Temporary/Demo διατηρείται μετά τη λήξη, αλλά οι δυνατότητες χρόνου εκτέλεσης της ανακαλούνται μετά την ημερομηνία λήξης.
The contract
Ένα plugin υλοποιεί μια σκόπιμα μικρή διεπαφή:
public interface IDoconutPlugin
{
string Name { get; } // π.χ. "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // η πύλη άδειας
void Register(IDoconutPluginBuilder builder); // συνεισφέρετε viewers/services
}Μέσα στο Register, ο builder δέχεται δύο είδη συνεισφορών:
builder.RegisterViewer(".dcm", () => new DicomViewer())— ένας προβολέας για μια επέκταση αρχείου,builder.RegisterService<TContract>(() => …)— μια τυποποιημένη υπηρεσία που άλλα μέρη του pipeline μπορούν να αναζητήσουν.
Capabilities and gating
Οι δυνατότητες είναι οι μονάδες άδειας. Converter και Dicom παρέχονται ως plugins με επιλογή ενεργοποίησης· Search και Annotation είναι ενσωματωμένα χαρακτηριστικά που περιορίζονται με τον ίδιο τρόπο. Ο βασικός προβολέας δεν είναι δυνατότητα — είναι η προαπαιτούμενη, εκτεθειμένη ως IsViewerLicensed στην υπηρεσία άδειας.
Η επικύρωση κατά την εκκίνηση συνήθως αποτρέπει ένα μη αδειοδοτημένο plugin από το να εισέλθει στο pipeline αιτήσεων. Η εργοστασιακή μονάδα προβολέα εφαρμόζει επίσης δύο αμυντικούς κανόνες χρόνου εκτέλεσης, που έχουν σημασία εάν τα δικαιώματα αλλάξουν μετά την εκκίνηση:
- Το plugin αντικαθιστά έναν ενσωματωμένο προβολέα (ένα plugin διεκδικεί μια επέκταση που επίσης διαχειρίζεται το ενσωματωμένο μητρώο): με την αδειοδοτημένη δυνατότητα, ο προβολέας του plugin κερδίζει· χωρίς αυτήν, το Doconut επιστρέφει σιωπηλά στον ενσωματωμένο προβολέα. Οι χρήστες εξακολουθούν να βλέπουν το έγγραφό τους — απλώς δεν λαμβάνουν τη λειτουργία του plugin.
- Μορφή μόνο-plugin (π.χ.
.dcm— το DICOM δεν έχει ενσωματωμένο προβολέα): χωρίς τη δυνατότητα η κλήση ανοίγματος αποτυγχάνει σκληρά:
LicenseException: This document type requires the 'Dicom' plugin license.Μια ενεργή άδεια Temporary χορηγεί κάθε δυνατότητα (με καθαρή, χωρίς υδατογράφημα βασική προβολή). Αυτό είναι μια κλασική πηγή εκπλήξεων κατά την έναρξη: η καταχώριση των ίδιων plugins με μια αγορασμένη άδεια που παραλείπει μία από τις δυνατότητές τους κάνει το AddDoconut() να αποτύχει κατά την εκκίνηση. Συγκρίνετε το IsCapabilityGranted(...) με το πλάνο σας πριν την ανάπτυξη. Το αντίστροφο: με καμία άδεια καθόλου, δεν χορηγείται τίποτα — μια ελλιπής άδεια δεν είναι άδεια Temporary.
Ο ίδιος περιορισμός εμφανίζεται στην πλευρά του πελάτη: Viewer.ReferenceScripts() και ReferenceCss() εκδίδουν τα πακέτα script/style για τις λειτουργίες που περιορίζονται από την άδεια (search, annotation, …) μόνο όταν η άδεια τις ενεργοποιεί, ώστε το UI του widget να παραμένει συνεπές με ό,τι θα κάνει πραγματικά ο διακομιστής.
Feature and plugin map
Το UI του προϊόντος χρησιμοποιεί το “plugin” ως ευρύ ετικέτα χαρακτηριστικού, αλλά η καταχώριση στον διακομιστή διαφέρει:
| Λειτουργία | Πώς ενεργοποιείται | Δυνατότητα | Συνεισφέρει |
|---|---|---|---|
| Σχόλιο | Ενσωματωμένο στον προβολέα· περιλαμβάνει πόρους σχολίων | Annotation | Δημιουργία μέσω προγράμματος περιήγησης, διατήρηση συνεδρίας και εξαγωγές με ενσωματωμένο περιεχόμενο |
| Αναζήτηση | Ενσωματωμένο σε προβολείς μορφών με δυνατότητα αναζήτησης· περιλαμβάνει πόρους αναζήτησης και ενεργοποιεί εξαγωγή όπου απαιτείται | Search | Φυσικό ευρετήριο κειμένου, επισημάνσεις και πλοήγηση αποτελεσμάτων |
| Μετατροπέας | Εγκαταστήστε το Doconut.NET8.Converter και καταχωρίστε το ConverterPlugin | Converter | Υπηρεσία μετατροπής C# και προαιρετικό web widget |
| DICOM | Εγκαταστήστε το Doconut.NET8.Dicom και καταχωρίστε το DicomPlugin | Dicom | Προβολή ιατρικών εικόνων για .dcm και .ima |
Τα Annotation και η κανονική Search δεν χρησιμοποιούν το AddPlugin<TPlugin>()· τα πακέτα τους εκδίδονται μόνο όταν η άδεια χορηγεί την αντίστοιχη δυνατότητα. Οι Converter και DICOM είναι υλοποιήσεις IDoconutPlugin με επιλογή ενεργοποίησης.
Released plugin packages
| Πρόσθετο | Πακέτο | Δυνατότητα | Συνεισφέρει |
|---|---|---|---|
| Μετατροπέας | Doconut.NET8.Converter | Converter | Δυνατότητα μετατροπής εγγράφων |
| DICOM | Doconut.NET8.Dicom | Dicom | Προβολή ιατρικών εικόνων (.dcm — μορφή μόνο-plugin) |
Κάθε ένα έχει μια αφιερωμένη σελίδα κάτω από Plugins με τη διαμόρφωση και τη χρήση του.
Custom viewers — your own format handler
Μπορείτε να ενσωματώσετε έναν προβολέα στο pipeline χωρίς να γράψετε ένα πακέτο plugin, απευθείας από το Program.cs:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // υλοποιεί IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // προαιρετική προεπιλεγμένη config
});Οι προσαρμοσμένοι προβολείς έχουν προτεραιότητα πάνω από τα πάντα — τόσο τα ενσωματωμένα όσο και τα plugins — και δεν περιορίζονται από άδεια (είναι ο κώδικάς σας). Η εργοστασιακή μονάδα επιστρέφει σε ένα ImageConfig όταν δεν παρέχετε προεπιλεγμένη διαμόρφωση.
Takeaways
- Τα plugins καταχωρίζονται ρητά και το
LicenseCapabilityτους επικυρώνεται κατά τη διάρκεια τουAddDoconut()— η έλλειψη ή ανεπαρκής μη-προσωρινή ενδυνάμωση αποτυγχάνει γρήγορα. - Τα plugins τύπου override υποχωρούν ομαλά· οι μορφές μόνο-plugin αποτυγχάνουν με ένα
LicenseException. - Μια ενεργή άδεια Temporary ξεκλειδώνει τα πάντα· η παραγωγική ξεκλειδώνει ό,τι αγοράσατε. Επαληθεύστε με το
IDoconutLicenseServiceπριν την αποστολή.
Ήταν αυτή η σελίδα χρήσιμη;