Sistem Plugin
Perluas penampil dengan plugin
Inti Doconut tetap ringan; fungsionalitas opsional dikirim sebagai plugin — paket NuGet terpisah yang menyumbangkan penampil atau layanan dan diaktifkan oleh lisensi Anda. Halaman ini menjelaskan model pendaftaran, apa yang terjadi saat startup ketika lisensi tidak mencakup sebuah plugin, dan cara memasang penampil Anda sendiri.
Mendaftarkan plugin
Setiap paket plugin mengekspos satu kelas plugin. Daftarkan sekali, di Application_Start:
Doconut.DoconutHost.Initialize(options =>
{
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});
// Plugin terdaftar yang lisensinya hilang melempar di sini, pada Application_Start, dan
// situs kemudian menjawab setiap permintaan dengan 500 kosong. Alasannya ada di log peristiwa Windows.AddPlugin<TPlugin>() membuat plugin dan membiarkannya mendaftarkan kontribusinya dengan DoconutOptions. Semua yang disumbangkan plugin ditandai dengan kapabilitas yang diperlukan plugin, dan DoconutHost.Initialize memeriksa setiap plugin yang terdaftar terhadap lisensi sebelum situs melayani permintaan pertamanya.
Lisensi plugin yang hilang menghentikan situs
Ketika tidak ada lisensi aktif yang memberikan kapabilitas plugin yang terdaftar — tidak ada lisensi sama sekali, file legacy TRIAL, atau lisensi berbayar tanpa kapabilitas tersebut — DoconutHost.Initialize melempar InvalidOperationException dari Application_Start:
The Converter plugin is registered via AddPlugin but no active license grants Converter.
Remove the AddPlugin<...>() call or install a license (or trial/demo) that includes Converter.Di System.Web, pengecualian dalam Application_Start tidak menghasilkan halaman error. Setiap permintaan menjawab 500 kosong, log IIS tidak menunjukkan apa pun yang berguna, dan pesan hanya muncul di log peristiwa Windows (log Aplikasi, sumber ASP.NET). Ketika sebuah situs berhenti merespons tepat setelah baris AddPlugin ditambahkan, periksa file lisensi di wwwroot terlebih dahulu — lihat Pengaturan Lisensi.
Kontrak
Sebuah plugin mengimplementasikan antarmuka yang sengaja kecil:
public interface IDoconutPlugin
{
string Name { get; } // mis. "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // gerbang lisensi
void Register(IDoconutPluginBuilder builder); // kontribusi penampil/layanan
}Di dalam Register, pembangun menerima dua jenis kontribusi:
builder.RegisterViewer(".dcm", () => new DicomViewer())— sebuah penampil untuk ekstensi file,builder.RegisterService<TContract>(() => …)— layanan bertipe yang dapat dicari oleh bagian lain dari pipeline.
Kapabilitas dan pengaturan
Kapabilitas adalah unit lisensi. Converter dan Dicom dikirim sebagai plugin opt‑in; Search dan Annotation adalah fitur bawaan yang diatur dengan cara yang sama. Penampil dasar bukan kapabilitas — ia adalah prasyarat, diekspos sebagai IsViewerLicensed pada layanan lisensi.
Validasi startup biasanya menjaga plugin yang tidak berlisensi keluar dari pipeline permintaan. Pabrik penampil juga menerapkan dua aturan defensif, yang penting jika hak berubah saat situs berjalan:
- Sebuah plugin yang menggantikan penampil bawaan (ia mengklaim ekstensi yang juga ditangani penampil bawaan): dengan kapabilitas berlisensi, penampil plugin menang; tanpa itu, Doconut kembali ke penampil bawaan. Pengguna tetap melihat dokumen mereka; mereka hanya tidak mendapatkan perilaku plugin.
- Format hanya plugin (
.dcmdan.ima— DICOM tidak memiliki penampil bawaan): tanpa kapabilitas, pembukaan gagal:
LicenseException: This document type requires the 'Dicom' plugin license.Lisensi Sementara yang aktif memberikan semua kapabilitas. Itu adalah kejutan klasik saat go‑live: baris AddPlugin yang sama yang dijalankan selama evaluasi menghentikan situs ketika lisensi yang dibeli tidak menyertakan salah satu kapabilitas tersebut. Bandingkan IsCapabilityGranted(...) dengan apa yang Anda beli sebelum menerapkan. Dengan tidak ada lisensi sama sekali, tidak ada yang diberikan — lisensi yang hilang bukan lisensi Sementara.
Pengaturan yang sama mencapai peramban: Viewer.ReferenceScripts() dan ReferenceCss() mengeluarkan file untuk fitur yang diatur lisensi (Pencarian, Anotasi) hanya ketika lisensi memberikannya, sehingga halaman tidak pernah menawarkan fitur yang akan ditolak server.
Peta Fitur dan Plugin
| Fitur | Cara diaktifkan | Kapabilitas | Kontribusi |
|---|---|---|---|
| Anotasi | Terintegrasi dalam penampil; sertakan sumber daya anotasi | Annotation | Pembuatan di peramban, persistensi sesi, ekspor yang dibakar |
| Pencarian | Terintegrasi dalam penampil format yang dapat dicari; sertakan sumber daya pencarian | Search | Indeks teks asli, sorotan, navigasi hasil |
| Konverter | Instal Doconut.NETFramework.Converter dan daftarkan ConverterPlugin | Converter | Layanan konversi C# dan widget web opsional |
| DICOM | Instal Doconut.NETFramework.Dicom dan daftarkan DicomPlugin | Dicom | Penayangan gambar medis untuk .dcm dan .ima |
Anotasi dan Pencarian tidak menggunakan AddPlugin<TPlugin>(). Konverter dan DICOM masing‑masing memiliki halaman di bawah Plugin dengan konfigurasi dan penggunaannya. Pada paket ini, DICOM merender halaman, bingkai, dan animasi, tetapi tidak membaca metadata teknis — lihat Plugin DICOM.
Penampil khusus — penangan format Anda sendiri
Anda dapat memasang penampil ke dalam pipeline tanpa menulis paket plugin, langsung di Application_Start:
Doconut.DoconutHost.Initialize(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // mengimplementasikan IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // konfigurasi default opsional
});Penampil khusus memiliki prioritas di atas segala sesuatu — bawaan dan plugin sekaligus — dan tidak diatur lisensi: mereka adalah kode Anda. Ketika Anda tidak menyediakan konfigurasi default, pabrik menggunakan sebuah ImageConfig.
Kesimpulan
- Plugin didaftarkan secara eksplisit di
DoconutHost.Initialize, dan kapabilitasnya divalidasi di sana; hak yang hilang menghentikan situs dengan500kosong yang alasannya ada di log peristiwa Windows. - Plugin gaya override menurun secara elegan; format hanya plugin gagal dengan sebuah
LicenseException. - Lisensi Sementara yang aktif membuka semua; produksi membuka apa yang Anda beli. Periksa dengan
IDoconutLicenseServicesebelum merilis.
Apakah halaman ini membantu?