Σύστημα Πρόσθετων

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

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

Αυτό το μοντέλο είναι νέο σε αυτήν την έκδοση. Η προηγούμενη βιβλιοθήκη .NET Standard δεν είχε μητρώο πρόσθετων: η μετατροπή ζούσε στον ίδιο τον προβολέα και οι άδειες πρόσθετων εγκαθίσταντο μέσω στατικών κλήσεων Viewer.SetLicensePlugin(...). Κανένα από αυτά δεν αποτελεί μηχανισμό καταχώρισης εδώ.

Καταχώριση πρόσθετου

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

csharp
builder.Services.AddDoconut(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});

Το AddPlugin<TPlugin>() δημιουργεί ένα στιγμιότυπο του πρόσθετου και καλεί την Register callback του εναντίον του μητρώου πρόσθετων που διατηρείται στο DoconutOptions. Ό,τι συνεισφέρει ένα πρόσθετο επισημαίνεται με την απαιτούμενη δυνατότητα του πρόσθετου. Το AddDoconut() επικυρώνει άμεσα τα καταχωρημένα πρόσθετα: μια ελλιπής άδεια, ένα παλιό αρχείο TRIAL ή μια επί πληρωμή άδεια χωρίς την ικανότητα αποτυγχάνει την εκκίνηση με InvalidOperationException. Μια καταχώριση Temporary/Demo διατηρείται μετά τη λήξη, αλλά οι δυνατότητες χρόνου εκτέλεσης της ανακαλούνται μετά την ημερομηνία λήξης.

Η σύμβαση

Ένα πρόσθετο υλοποιεί μια σκόπιμα μικρή διεπαφή:

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // π.χ. "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // η πύλη άδειας
    void Register(IDoconutPluginBuilder builder); // συνεισφέρετε σε προβολείς/υπηρεσίες
}

Μέσα στο Register, ο builder δέχεται δύο είδη συνεισφορών:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — ένας προβολέας για μια επέκταση αρχείου,
  • builder.RegisterService<TContract>(() => …) — μια τυποποιημένη υπηρεσία που μπορούν να αναζητήσουν άλλα μέρη της αλυσίδας.

Δυνατότητες και περιορισμός

Οι δυνατότητες είναι οι μονάδες της άδειας. Τα Converter και Dicom παρέχονται ως πρόσθετα με επιλογή ενεργοποίησης· τα Search και Annotation είναι ενσωματωμένα χαρακτηριστικά που περιορίζονται με τον ίδιο τρόπο. Ο βασικός προβολέας δεν είναι δυνατότητα — είναι η προαπαιτούμενη προϋπόθεση, εκτεθειμένη ως IsViewerLicensed στην υπηρεσία αδειών.

Η επικύρωση κατά την εκκίνηση συνήθως αποτρέπει ένα μη αδειοδοτημένο πρόσθετο από το να εισέλθει στην αλυσίδα αιτήσεων. Η εργοστασιακή μονάδα προβολέα εφαρμόζει επίσης δύο αμυντικούς κανόνες χρόνου εκτέλεσης, που έχουν σημασία εάν τα δικαιώματα αλλάξουν μετά την εκκίνηση:

  • Το πρόσθετο αντικαθιστά έναν ενσωματωμένο προβολέα (ένα πρόσθετο διεκδικεί μια επέκταση που επίσης διαχειρίζεται το ενσωματωμένο μητρώο): με την αδειοδοτημένη δυνατότητα, ο προβολέας του πρόσθετου κερδίζει· χωρίς αυτήν, το Doconut επιστρέφει σιωπηρά στον ενσωματωμένο προβολέα. Οι χρήστες εξακολουθούν να βλέπουν το έγγραφό τους — απλώς δεν λαμβάνουν τη λειτουργία του πρόσθετου.
  • Μορφή μόνο-πρόσθετου (π.χ. .dcm — το DICOM δεν έχει ενσωματωμένο προβολέα): χωρίς τη δυνατότητα η κλήση ανοίγματος αποτυγχάνει σκληρά:
text
LicenseException: This document type requires the 'Dicom' plugin license.

Μία ενεργή άδεια Temporary χορηγεί κάθε δυνατότητα (με καθαρή, χωρίς υδατογράφημα βασική προβολή). Αυτό είναι μια κλασική πηγή εκπλήξεων κατά την έναρξη λειτουργίας: η καταχώριση των ίδιων πρόσθετων με μια αγορασμένη άδεια που παραλείπει μία από τις δυνατότητές τους κάνει το AddDoconut() να αποτύχει κατά την εκκίνηση. Συγκρίνετε το IsCapabilityGranted(...) με το πλάνο σας πριν την ανάπτυξη. Από την άλλη πλευρά: με καμία άδεια καθόλου, δεν χορηγείται τίποτα — μια ελλιπής άδεια δεν είναι άδεια Temporary.

Ο ίδιος περιορισμός εμφανίζεται και στην πλευρά του πελάτη: τα Viewer.ReferenceScripts() και ReferenceCss() εκδίδουν τα πακέτα script/style για τις λειτουργίες που περιορίζονται από την άδεια (αναζήτηση, σχολιασμός, …) μόνο όταν η άδεια τις ενεργοποιεί, ώστε το UI του widget να παραμένει συνεπές με ό,τι θα κάνει πραγματικά ο διακομιστής.

Χάρτης χαρακτηριστικών και πρόσθετων

Το UI του προϊόντος χρησιμοποιεί το «plugin» ως ευρύ ετικέτα χαρακτηριστικού, αλλά η καταχώριση στον διακομιστή διαφέρει:

ΧαρακτηριστικόΠώς ενεργοποιείταιΔυνατότηταΣυνεισφέρει
ΣχόλιοΕνσωματωμένο στον προβολέα· περιλαμβάνει πόρους σχολιασμούAnnotationΔημιουργία στο πρόγραμμα περιήγησης, διατήρηση συνεδρίας και εξαγωγές με ενσωματωμένο υδατογράφημα
ΑναζήτησηΕνσωματωμένο σε προβολείς μορφών με δυνατότητα αναζήτησης· περιλαμβάνει πόρους αναζήτησης και ενεργοποιεί εξαγωγή όπου απαιτείταιSearchΦυσικός δείκτης κειμένου, επισημάνσεις και πλοήγηση αποτελεσμάτων
ΜετατροπέαςΕγκαταστήστε Doconut.NETStandard.Converter και καταχωρίστε ConverterPluginConverterΥπηρεσία μετατροπής C# και προαιρετικό web widget
DICOMΕγκαταστήστε Doconut.NETStandard.Dicom και καταχωρίστε DicomPluginDicomΠροβολή ιατρικών εικόνων για .dcm και .ima

Τα Σχόλιο και η κανονική Αναζήτηση δεν χρησιμοποιούν το AddPlugin<TPlugin>()· τα πακέτα τους εκδίδονται μόνο όταν η άδεια χορηγεί την αντίστοιχη δυνατότητα. Οι Μετατροπέας και το DICOM είναι οι κυκλοφορημένες υλοποιήσεις opt‑in IDoconutPlugin για αυτό το σύνολο τεκμηρίωσης.

Τα εγκεκριμένα αντικείμενα .NET Standard περιέχουν τα Doconut.NETStandard.Converter και Doconut.NETStandard.Dicom στην ίδια έκδοση με το βασικό πακέτο.

Κυκλοφορημένα πακέτα πρόσθετων

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

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

Προσαρμοσμένοι προβολείς — ο δικός σας χειριστής μορφής

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

csharp
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // υλοποιεί IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // προαιρετική προεπιλεγμένη διαμόρφωση
});

Οι προσαρμοσμένοι προβολείς έχουν προτεραιότητα πάνω από τα πάντα — τόσο ενσωματωμένα όσο και πρόσθετα — και δεν περιορίζονται από άδεια (είναι ο κώδικάς σας). Η εργοστασιακή μονάδα επιστρέφει σε ένα ImageConfig όταν δεν παρέχετε προεπιλεγμένη διαμόρφωση.

Συμπεράσματα

  • Τα πρόσθετα καταχωρούνται ρητά και το LicenseCapability τους επικυρώνεται κατά τη διάρκεια του AddDoconut() — η έλλειψη ή η ανεπαρκής μη‑προσωρινή δικαιοδοσία αποτυγχάνει γρήγορα.
  • Τα πρόσθετα τύπου παράκαμψης υποβαθμίζονται ομαλά· οι μορφές μόνο-πρόσθετου αποτυγχάνουν με ένα LicenseException.
  • Μία ενεργή άδεια Temporary ξεκλειδώνει τα πάντα· η παραγωγική άδεια ξεκλειδώνει ό,τι αγοράσατε. Επαληθεύστε με το IDoconutLicenseService πριν τη διανομή.

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