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, bagaimana pengaturan lisensi berperilaku pada waktu berjalan, dan cara menambahkan penampil Anda sendiri.

Mendaftarkan plugin

Setiap paket plugin mengekspos satu kelas plugin. Anda mendaftarkannya sekali, saat startup:

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

AddPlugin<TPlugin>() menginstansiasi plugin dan memanggil callback Register‑nya terhadap registri plugin yang disimpan pada DoconutOptions. Semua yang disumbangkan plugin ditandai dengan kapabilitas yang diperlukan plugin. AddDoconut() memvalidasi plugin yang terdaftar secara langsung: lisensi yang hilang, file TRIAL lama, atau lisensi berbayar tanpa kapabilitas menyebabkan kegagalan startup dengan InvalidOperationException. Registrasi Temporary/Demo dipertahankan melewati masa kedaluwarsa, tetapi kapabilitas runtime‑nya dicabut setelah tanggal kedaluwarsa.

Kontrak

Sebuah plugin mengimplementasikan antarmuka yang sengaja kecil:

text
public interface IDoconutPlugin
{
    string Name { get; }                          // e.g. "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // the license gate
    void Register(IDoconutPluginBuilder builder); // contribute viewers/services
}

Di dalam Register, builder menerima dua jenis kontribusi:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — 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 opsional; 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 oleh registri bawaan): dengan kapabilitas yang dilisensikan, penampil plugin menang; tanpa itu, Doconut diam‑diam kembali ke penampil bawaan. Pengguna masih 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:
text
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 berbayar yang tidak menyertakan salah satu kapabilitasnya menyebabkan AddDoconut() gagal selama 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:

FiturCara diaktifkanKapabilitasKontribusi
AnnotationTerintegrasi dalam penampil; termasuk sumber daya anotasiAnnotationPembuatan di browser, persistensi sesi, dan ekspor yang dibakar ke dalam gambar
SearchTerintegrasi dalam penampil format yang dapat dicari; termasuk sumber daya pencarian dan mengaktifkan ekstraksi bila diperlukanSearchIndeks teks asli, sorotan, dan navigasi hasil
ConverterInstal Doconut.NET6.Converter dan daftarkan ConverterPluginConverterLayanan konversi C# dan widget web opsional
DICOMInstal Doconut.NET6.Dicom dan daftarkan DicomPluginDicomPenayangan citra medis untuk .dcm dan .ima

Annotation dan Search standar tidak menggunakan AddPlugin<TPlugin>(); bundel mereka dihasilkan hanya ketika lisensi memberikan kapabilitas yang bersesuaian. Converter dan DICOM adalah implementasi IDoconutPlugin opsional yang dirilis untuk set dokumentasi ini.

Artefak .NET 6 yang disetujui berisi Doconut.NET6.Converter dan Doconut.NET6.Dicom pada versi yang sama dengan paket inti.

Paket plugin yang dirilis

PluginPaketKapabilitasKontribusi
ConverterDoconut.NET6.ConverterConverterKapabilitas konversi dokumen
DICOMDoconut.NET6.DicomDicomPenayangan citra medis (.dcm — format hanya plugin)

Setiap plugin memiliki halaman khusus di bawah Plugins dengan konfigurasi dan cara penggunaannya.

Penampil khusus — penangan format Anda sendiri

Anda dapat menambahkan penampil ke pipeline tanpa menulis paket plugin, langsung dari Program.cs:

text
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // implements IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // optional default config
});

Penampil khusus memiliki prioritas di atas segala sesuatu — 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 LicenseCapability‑nya divalidasi selama AddDoconut() — hak yang hilang atau tidak cukup selain temporary menyebabkan kegagalan 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 IDoconutLicenseService sebelum merilis.

Apakah halaman ini membantu?