Σύστημα Προσθηκών

Επεκτείνετε τον προβολέα με προσθήκες

Ο πυρήνας του Doconut παραμένει ελαφρύς· η προαιρετική λειτουργικότητα παρέχεται ως plugins — ξεχωριστά πακέτα NuGet που συνεισφέρουν προβολείς ή υπηρεσίες και ενεργοποιούνται από την άδειά σας. Αυτή η σελίδα εξηγεί το μοντέλο καταχώρισης, πώς ο περιορισμός άδειας συμπεριφέρεται σε χρόνο εκτέλεσης και πώς να ενσωματώσετε τον δικό σας προβολέα.

Registering a plugin

Κάθε πακέτο plugin εκθέτει μία κλάση plugin. Την καταχωρίζετε μία φορά, κατά την εκκίνηση:

csharp
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 υλοποιεί μια σκόπιμα μικρή διεπαφή:

csharp
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 δεν έχει ενσωματωμένο προβολέα): χωρίς τη δυνατότητα η κλήση ανοίγματος αποτυγχάνει σκληρά:
text
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 και καταχωρίστε το ConverterPluginConverterΥπηρεσία μετατροπής C# και προαιρετικό web widget
DICOMΕγκαταστήστε το Doconut.NET8.Dicom και καταχωρίστε το DicomPluginDicomΠροβολή ιατρικών εικόνων για .dcm και .ima

Τα Annotation και η κανονική Search δεν χρησιμοποιούν το AddPlugin<TPlugin>()· τα πακέτα τους εκδίδονται μόνο όταν η άδεια χορηγεί την αντίστοιχη δυνατότητα. Οι Converter και DICOM είναι υλοποιήσεις IDoconutPlugin με επιλογή ενεργοποίησης.

Released plugin packages

ΠρόσθετοΠακέτοΔυνατότηταΣυνεισφέρει
ΜετατροπέαςDoconut.NET8.ConverterConverterΔυνατότητα μετατροπής εγγράφων
DICOMDoconut.NET8.DicomDicomΠροβολή ιατρικών εικόνων (.dcm — μορφή μόνο-plugin)

Κάθε ένα έχει μια αφιερωμένη σελίδα κάτω από Plugins με τη διαμόρφωση και τη χρήση του.

Custom viewers — your own format handler

Μπορείτε να ενσωματώσετε έναν προβολέα στο pipeline χωρίς να γράψετε ένα πακέτο plugin, απευθείας από το Program.cs:

csharp
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 πριν την αποστολή.

Ήταν αυτή η σελίδα χρήσιμη;