Sistem Plugin
Perluas penampil dengan plugin
Inti Doconut tetap ramping; fungsionalitas opsional dikirim sebagai plugin — paket NuGet terpisah yang menyumbangkan penampil atau layanan dan diaktifkan oleh lisensi Anda. Halaman ini menjelaskan model pendaftaran, bagaimana pengaturan lisensi berperilaku pada waktu jalan, dan cara memasang penampil Anda sendiri.
Model ini baru dalam rilis ini. Perpustakaan .NET Standard sebelumnya tidak memiliki registri plugin: konversi berada pada penampil itu sendiri dan lisensi plugin diinstal melalui panggilan statis Viewer.SetLicensePlugin(...). Tidak ada yang merupakan mekanisme pendaftaran di sini.
Mendaftarkan sebuah plugin
Setiap paket plugin mengekspos satu kelas plugin. Anda mendaftarkannya sekali, saat startup:
builder.Services.AddDoconut(options =>
{
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});AddPlugin<TPlugin>() menginstansiasi plugin dan memanggil callback Register terhadap registri plugin yang disimpan pada DoconutOptions. Semua yang disumbangkan plugin ditandai dengan kapabilitas yang diperlukan plugin. AddDoconut() memvalidasi plugin yang terdaftar segera: lisensi yang hilang, file legacy TRIAL, atau lisensi berbayar tanpa kapabilitas menyebabkan startup gagal dengan InvalidOperationException. Registrasi Temporary/Demo dipertahankan melewati kedaluwarsa, tetapi kapabilitas runtime‑nya dicabut setelah tanggal kedaluwarsa.
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 sebuah kapabilitas — ia adalah prasyarat, diekspos sebagai IsViewerLicensed pada layanan lisensi.
Validasi startup biasanya mencegah plugin tanpa lisensi masuk ke pipeline permintaan. Pabrik penampil juga menerapkan dua aturan runtime defensif, yang penting jika hak berubah setelah startup:
- Plugin menggantikan penampil bawaan (sebuah plugin mengklaim ekstensi yang juga ditangani registri bawaan): dengan kapabilitas berlisensi, penampil plugin menang; tanpa itu, Doconut diam‑diam kembali ke penampil bawaan. Pengguna tetap melihat dokumen mereka — mereka hanya tidak mendapatkan fitur plugin.
- Format hanya plugin (misalnya
.dcm— DICOM tidak memiliki penampil bawaan): tanpa kapabilitas panggilan buka gagal keras:
LicenseException: This document type requires the 'Dicom' plugin license.Lisensi Temporary yang aktif memberikan semua kapabilitas (dengan tampilan dasar bersih, tanpa watermark). Ini adalah sumber klasik kejutan saat go‑live: mendaftarkan plugin yang sama dengan lisensi yang dibeli yang menghilangkan salah satu kapabilitasnya membuat AddDoconut() gagal saat startup. Bandingkan IsCapabilityGranted(...) dengan rencana Anda sebelum menerapkan. Sebaliknya: dengan tidak ada lisensi sama sekali, tidak ada yang diberikan — lisensi yang hilang bukan lisensi Temporary.
Pengaturan yang sama muncul di sisi klien: Viewer.ReferenceScripts() dan ReferenceCss() menghasilkan bundel skrip/gaya untuk fitur yang diatur lisensi (pencarian, anotasi, …) hanya ketika lisensi mengaktifkannya, sehingga UI widget tetap konsisten dengan apa yang sebenarnya dilakukan server.
Peta Fitur dan Plugin
UI produk menggunakan "plugin" sebagai label fitur yang luas, tetapi pendaftaran server berbeda:
| Fitur | Cara diaktifkan | Kapabilitas | Kontribusi |
|---|---|---|---|
| Annotation | Terintegrasi dalam penampil; termasuk sumber daya anotasi | Annotation | Pembuatan di browser, persistensi sesi, dan ekspor yang dibakar |
| Search | Terintegrasi dalam penampil format yang dapat dicari; termasuk sumber daya pencarian dan mengaktifkan ekstraksi bila diperlukan | Search | Indeks teks asli, sorotan, dan navigasi hasil |
| Converter | Pasang Doconut.NETStandard.Converter dan daftarkan ConverterPlugin | Converter | Layanan konversi C# dan widget web opsional |
| DICOM | Pasang Doconut.NETStandard.Dicom dan daftarkan DicomPlugin | Dicom | Penayangan gambar medis untuk .dcm dan .ima |
Anotasi dan Pencarian normal tidak menggunakan AddPlugin<TPlugin>(); bundel mereka dihasilkan hanya ketika lisensi memberikan kapabilitas yang bersesuaian. Converter dan DICOM adalah implementasi opt‑in IDoconutPlugin yang dirilis untuk set dokumentasi ini.
Artefak .NET Standard yang disetujui berisi Doconut.NETStandard.Converter dan Doconut.NETStandard.Dicom pada versi yang sama dengan paket inti.
Paket Plugin yang Dirilis
| Plugin | Paket | Kapabilitas | Kontribusi |
|---|---|---|---|
| Converter | Doconut.NETStandard.Converter | Converter | Kapabilitas konversi dokumen |
| DICOM | Doconut.NETStandard.Dicom | Dicom | Penayangan gambar medis (.dcm — format hanya plugin) |
Setiap memiliki halaman khusus di bawah Plugin dengan konfigurasi dan penggunaannya.
Penampil Kustom — penangan format Anda sendiri
Anda dapat memasang penampil ke dalam pipeline tanpa menulis paket plugin, langsung dari Program.cs:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // mengimplementasikan IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // konfigurasi default opsional
});Penampil kustom memiliki prioritas di atas semua — bawaan dan plugin sekaligus — dan tidak diatur lisensi (mereka adalah kode Anda). Pabrik kembali ke ImageConfig ketika Anda tidak menyediakan konfigurasi default.
Kesimpulan
- Plugin didaftarkan secara eksplisit dan
LicenseCapabilitymereka divalidasi selamaAddDoconut()— hak yang hilang atau tidak cukup selain Temporary gagal cepat. - Plugin gaya override menurun secara elegan; format hanya plugin gagal dengan
LicenseException. - Lisensi Temporary yang aktif membuka semua; produksi membuka apa yang Anda beli. Verifikasi dengan
IDoconutLicenseServicesebelum merilis.
Apakah halaman ini membantu?