Hệ thống Plugin
Mở rộng trình xem bằng các plugin
Lõi của Doconut vẫn gọn nhẹ; chức năng tùy chọn được cung cấp dưới dạng plugins — các gói NuGet riêng biệt đóng góp các trình xem hoặc dịch vụ và được kích hoạt bằng giấy phép của bạn. Trang này giải thích mô hình đăng ký, cách kiểm soát giấy phép hoạt động tại thời gian chạy, và cách tích hợp trình xem của riêng bạn.
Đăng ký plugin
Mỗi gói plugin cung cấp một lớp plugin. Bạn đăng ký nó một lần, khi khởi động:
builder.Services.AddDoconut(options =>
{
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});AddPlugin<TPlugin>() khởi tạo plugin và gọi callback Register của nó đối với registry plugin được lưu trên DoconutOptions. Mọi thứ mà một plugin đóng góp đều được gắn thẻ với khả năng yêu cầu của plugin. AddDoconut() xác thực các plugin đã đăng ký ngay lập tức: thiếu giấy phép, tệp legacy TRIAL, hoặc giấy phép trả phí mà không có capability sẽ khiến khởi động thất bại với InvalidOperationException. Một đăng ký Temporary/Demo được giữ lại qua thời gian hết hạn, nhưng các capability thời gian chạy của nó sẽ bị thu hồi sau ngày hết hạn.
Hợp đồng
Một plugin thực hiện một giao diện được thiết kế cố ý nhỏ gọn:
public interface IDoconutPlugin
{
string Name { get; } // ví dụ: "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // cổng giấy phép
void Register(IDoconutPluginBuilder builder); // đóng góp các trình xem/dịch vụ
}Trong Register, builder chấp nhận hai loại đóng góp:
builder.RegisterViewer(".dcm", () => new DicomViewer())— một trình xem cho một phần mở rộng tệp,builder.RegisterService<TContract>(() => …)— một dịch vụ kiểu mà các phần khác của pipeline có thể tra cứu.
Khả năng và kiểm soát
Capabilities là các đơn vị giấy phép. Converter và Dicom được cung cấp dưới dạng plugin tùy chọn; Search và Annotation là các tính năng tích hợp sẵn được kiểm soát theo cùng cách. Trình xem cơ bản không phải là một capability — nó là điều kiện tiên quyết, được phơi bày dưới dạng IsViewerLicensed trên dịch vụ giấy phép.
Việc xác thực khi khởi động thường ngăn một plugin không có giấy phép tham gia vào pipeline yêu cầu. Nhà máy trình xem cũng áp dụng hai quy tắc bảo vệ thời gian chạy, quan trọng nếu quyền thay đổi sau khi khởi động:
- Plugin ghi đè một trình xem tích hợp sẵn (một plugin yêu cầu một phần mở rộng mà registry tích hợp sẵn cũng xử lý): nếu capability được cấp phép, trình xem plugin thắng; không có nó, Doconut sẽ im lặng quay lại trình xem tích hợp sẵn. Người dùng vẫn thấy tài liệu của họ — họ chỉ không có tính năng plugin.
- Plugin-only format (ví dụ
.dcm— DICOM không có trình xem tích hợp sẵn): nếu không có capability, lời gọi mở sẽ thất bại nghiêm trọng:
LicenseException: This document type requires the 'Dicom' plugin license.Một giấy phép Temporary hoạt động sẽ cấp mọi capability (với chế độ xem cơ bản sạch sẽ, không có watermark). Đây là nguồn gây bất ngờ khi đưa vào hoạt động: đăng ký cùng các plugin với giấy phép đã mua mà thiếu một trong các capability khiến AddDoconut() thất bại trong quá trình khởi động. So sánh IsCapabilityGranted(...) với kế hoạch của bạn trước khi triển khai. Ngược lại: với không có giấy phép nào cả, không có gì được cấp — một giấy phép thiếu không phải là giấy phép Temporary.
Cùng một cơ chế kiểm soát cũng xuất hiện phía client: Viewer.ReferenceScripts() và ReferenceCss() phát ra các bundle script/style cho các tính năng được kiểm soát bằng giấy phép (tìm kiếm, chú thích, …) chỉ khi giấy phép cho phép chúng, vì vậy UI của widget vẫn nhất quán với những gì server thực sự thực hiện.
Bản đồ tính năng và plugin
Giao diện sản phẩm sử dụng “plugin” như một nhãn tính năng rộng, nhưng việc đăng ký phía server lại khác:
| Tính năng | Cách kích hoạt | Khả năng | Đóng góp |
|---|---|---|---|
| Chú thích | Tích hợp trong trình xem; bao gồm tài nguyên chú thích | Annotation | Tạo nội dung trong trình duyệt, duy trì phiên, và xuất bản có nhúng |
| Tìm kiếm | Tích hợp trong các trình xem định dạng có khả năng tìm kiếm; bao gồm tài nguyên tìm kiếm và cho phép trích xuất khi cần | Search | Chỉ mục văn bản gốc, đánh dấu, và điều hướng kết quả |
| Bộ chuyển đổi | Cài đặt Doconut.NET6.Converter và đăng ký ConverterPlugin | Converter | Dịch vụ chuyển đổi C# và widget web tùy chọn |
| DICOM | Cài đặt Doconut.NET6.Dicom và đăng ký DicomPlugin | Dicom | Xem ảnh y tế cho .dcm và .ima |
Chú thích và Tìm kiếm thông thường không sử dụng AddPlugin<TPlugin>(); các bundle của chúng chỉ được phát ra khi giấy phép cấp khả năng tương ứng. Bộ chuyển đổi và DICOM là các triển khai opt-in IDoconutPlugin đã phát hành cho bộ tài liệu này.
Các artefact .NET 6 đã được phê duyệt chứa Doconut.NET6.Converter và Doconut.NET6.Dicom ở cùng phiên bản với gói lõi.
Các gói plugin đã phát hành
| Plugin | Gói | Capability | Đóng góp |
|---|---|---|---|
| Bộ chuyển đổi | Doconut.NET6.Converter | Converter | Khả năng chuyển đổi tài liệu |
| DICOM | Doconut.NET6.Dicom | Dicom | Xem ảnh y tế (.dcm — định dạng chỉ có plugin) |
Mỗi plugin có một trang riêng dưới Plugins với cấu hình và cách sử dụng của nó.
Trình xem tùy chỉnh — bộ xử lý định dạng của bạn
Bạn có thể tích hợp một trình xem vào pipeline mà không cần viết gói plugin, trực tiếp từ Program.cs:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // thực hiện IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // cấu hình mặc định tùy chọn
});Trình xem tùy chỉnh có ưu tiên hơn mọi thứ — cả tích hợp sẵn và plugin — và không bị kiểm soát bằng giấy phép (chúng là mã của bạn). Nhà máy sẽ quay lại một ImageConfig khi bạn không cung cấp cấu hình mặc định.
Những điểm cần nhớ
- Plugins được đăng ký một cách rõ ràng và
LicenseCapabilitycủa chúng được xác thực trong quá trìnhAddDoconut()— thiếu hoặc không đủ quyền không tạm thời sẽ thất bại nhanh. - Plugins kiểu ghi đè giảm dần một cách nhẹ nhàng; các định dạng chỉ có plugin sẽ thất bại với một
LicenseException. - Giấy phép Temporary hoạt động sẽ mở khóa mọi thứ; môi trường production mở khóa những gì bạn đã mua. Xác minh với
IDoconutLicenseServicetrước khi phát hành.
Trang này có hữu ích không?