Hệ thống Plugin

Mở rộng trình xem bằng các plugin

Core của Doconut vẫn gọn nhẹ; các 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 bậ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ý một plugin

Mỗi gói plugin cung cấp một lớp plugin. Bạn đăng ký nó một lần, vào lúc khởi động:

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

AddPlugin<TPlugin>() tạo một thể hiện của 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 required capability của plugin. AddDoconut() kiểm tra các plugin đã đăng ký ngay lập tức: thiếu giấy phép, tệp TRIAL cũ, hoặc giấy phép trả phí mà không có khả năng tương ứng sẽ khiến khởi động thất bại với InvalidOperationException. Một đăng ký Temporary/Demo được giữ lại sau khi hết hạn, nhưng các khả năng runtime của nó sẽ bị thu hồi sau ngày hết hạn.

Hợp đồng

Một plugin triển khai một giao diện rất nhỏ và có chủ đích:

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
}

Trong Register, builder chấp nhận hai loại đóng góp:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — một trình xem cho 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. ConverterDicom được cung cấp dưới dạng plugin tùy chọn; SearchAnnotation là các tính năng tích hợp sẵn và đượ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 hiển thị dưới dạng IsViewerLicensed trên dịch vụ giấy phép.

Kiểm tra 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 tạo trình xem cũng áp dụng hai quy tắc runtime phòng thủ, 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 (một plugin yêu cầu một phần mở rộng mà registry tích hợp cũng xử lý): nếu có capability được cấp phép, trình xem plugin sẽ thắng; nếu không, Doconut sẽ im lặng quay lại trình xem tích hợp. Người dùng vẫn thấy tài liệu của họ — chỉ là họ không nhận được tính năng plugin.
  • Định dạng chỉ có plugin (ví dụ .dcm — DICOM không có trình xem tích hợp): nếu không có capability, lời gọi mở sẽ thất bại nghiêm trọng:
text
LicenseException: This document type requires the 'Dicom' plugin license.

Một giấy phép Temporary đang 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 nhưng thiếu một trong các capability của chúng sẽ khiến AddDoconut() thất bại khi 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, 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()ReferenceCss() phát ra các gói script/style cho các tính năng được kiểm soát bằng giấy phép (search, annotation, …) chỉ khi giấy phép cho phép chúng, vì vậy giao diện 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ăngCách kích hoạtCapabilityĐóng góp
AnnotationTích hợp trong trình xem; bao gồm tài nguyên chú thíchAnnotationTạo nội dung trong trình duyệt, duy trì phiên, và xuất bản có nhúng chú thích
SearchTí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ầnSearchChỉ mục văn bản gốc, đánh dấu, và điều hướng kết quả
ConverterCài đặt Doconut.NET6.Converter và đăng ký ConverterPluginConverterDịch vụ chuyển đổi C# và widget web tùy chọn
DICOMCài đặt Doconut.NET6.Dicom và đăng ký DicomPluginDicomXem ảnh y tế cho .dcm.ima

Annotation và Search thông thường không sử dụng AddPlugin<TPlugin>(); các gói của chúng chỉ được phát ra khi giấy phép cấp quyền capability tương ứng. Converter và DICOM là các triển khai IDoconutPlugin tùy chọn đã được 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.ConverterDoconut.NET6.Dicom ở cùng phiên bản với gói core.

Các gói plugin đã phát hành

PluginGóiCapabilityĐóng góp
ConverterDoconut.NET6.ConverterConverterKhả năng chuyển đổi tài liệu
DICOMDoconut.NET6.DicomDicomXem ảnh y tế (.dcm — định dạng chỉ có plugin)

Mỗi plugin có một trang riêng dưới mục 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:

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

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 ImageConfig khi bạn không cung cấp cấu hình mặc định.

Những điểm cần nhớ

  • Các plugin được đăng ký một cách rõ ràng và LicenseCapability của chúng được xác thực trong quá trình AddDoconut() — quyền không tạm thời bị thiếu hoặc không đủ sẽ thất bại nhanh.
  • Các plugin kiểu ghi đè sẽ 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 LicenseException.
  • Giấy phép Temporary đang 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 IDoconutLicenseService trước khi phát hành.

Trang này có hữu ích không?