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 bật bằng giấy phép của bạn. Trang này giải thích mô hình đăng ký, những gì xảy ra khi khởi động nếu giấy phép không bao phủ một plugin, 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. Đăng ký nó một lần, trong Application_Start:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});
// Một plugin đã đăng ký mà giấy phép bị thiếu sẽ ném ngoại lệ ở đây, trong Application_Start, và
// trang web sau đó trả lời mọi yêu cầu bằng một lỗi 500 trống. Lý do nằm trong nhật ký sự kiện Windows.

AddPlugin<TPlugin>() tạo plugin và cho phép nó đăng ký các đóng góp của mình với 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, và DoconutHost.Initialize kiểm tra mọi plugin đã đăng ký so với giấy phép trước khi site phục vụ yêu cầu đầu tiên.

Thiếu giấy phép plugin làm ngừng site

Khi không có giấy phép hoạt động nào cấp khả năng cho plugin đã đăng ký — không có giấy phép nào, một tệp legacy TRIAL, hoặc một giấy phép trả phí mà không có khả năng đó — DoconutHost.Initialize ném InvalidOperationException từ Application_Start:

text
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.

Trong System.Web, một ngoại lệ trong Application_Start không tạo ra trang lỗi. Mọi yêu cầu trả về một 500 trống, nhật ký IIS không hiển thị gì hữu ích, và thông báo chỉ xuất hiện trong nhật ký sự kiện Windows (nhật ký Ứng dụng, nguồn ASP.NET). Khi một site ngừng phản hồi ngay sau khi dòng AddPlugin được thêm, hãy kiểm tra các tệp giấy phép trong wwwroot trước — xem License Setup.

Hợp đồng

Một plugin thực hiện một giao diện được thiết kế nhỏ gọn:

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // ví dụ: "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // cổng giấy phép
    void Register(IDoconutPluginBuilder builder); // cộng tác viewers/services
}

Bên trong Register, trình xây dựng 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

Khả năng là các đơn vị giấy phép. Converter và Dicom được cung cấp như các 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 khả năng — 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 khởi động thường giữ một plugin không có giấy phép ra khỏi pipeline yêu cầu. Nhà máy trình xem cũng áp dụng hai quy tắc phòng thủ, quan trọng nếu quyền thay đổi trong khi site đang chạy:

  • Một plugin ghi đè lên trình xem tích hợp sẵn (nó yêu cầu một phần mở rộng mà trình xem tích hợp sẵn cũng xử lý): nếu khả năng được cấp phép, trình xem của plugin sẽ thắng; nếu không, Doconut sẽ 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 nhận được hành vi của plugin.
  • Một định dạng chỉ có plugin (.dcm và .ima — DICOM không có trình xem tích hợp sẵn): nếu không có khả năng, việc mở sẽ thất bại:
text
LicenseException: This document type requires the 'Dicom' plugin license.

Một giấy phép Temporary hoạt động cấp mọi khả năng. Đó là một bất ngờ thường gặp khi đưa vào hoạt động: các dòng AddPlugin đã chạy trong quá trình đánh giá sẽ làm site dừng lại khi giấy phép mua không bao gồm một trong những khả năng đó. So sánh IsCapabilityGranted(...) với những gì bạn đã mua trước khi triển khai. 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 này cũng áp dụng cho trình duyệt: Viewer.ReferenceScripts() và ReferenceCss() phát ra các tệp 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 cấp chúng, vì vậy trang không bao giờ đề xuất tính năng mà máy chủ sẽ từ chối.

Bản đồ tính năng và plugin

Tính năngCách kích hoạtKhả năngĐóng góp
AnnotationTích hợp trong trình xem; bao gồm các tài nguyên chú thíchAnnotationTạo nội dung trên trình duyệt, duy trì phiên, xuất bản có nhúng
SearchTích hợp trong các trình xem định dạng có khả năng tìm kiếm; bao gồm các tài nguyên tìm kiếmSearchChỉ mục văn bản gốc, đánh dấu, điều hướng kết quả
ConverterCài đặt Doconut.NETFramework.Converter và đăng ký ConverterPluginConverterDịch vụ chuyển đổi C# và một widget web tùy chọn
DICOMCài đặt Doconut.NETFramework.Dicom và đăng ký DicomPluginDicomXem hình ảnh y tế cho .dcm và .ima

Annotation và Search không sử dụng AddPlugin<TPlugin>(). Converter và DICOM mỗi đều có một trang dưới Plugins với cấu hình và cách sử dụng của chúng. Trong gói này, DICOM hiển thị các trang, khung và hoạt hình, nhưng không đọc siêu dữ liệu kỹ thuật — xem DICOM Plugin.

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 trong Application_Start:

csharp
Doconut.DoconutHost.Initialize(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. Khi bạn không cung cấp cấu hình mặc định, nhà máy sẽ sử dụng một ImageConfig.

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

  • Plugins được đăng ký một cách rõ ràng trong DoconutHost.Initialize, và các khả năng của chúng được xác thực ở đó; một quyền thiếu sẽ làm site dừng lại với một 500 trống, lý do được ghi trong nhật ký sự kiện Windows.
  • Các plugin 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.
  • Một giấy phép Temporary hoạt động mở khóa mọi thứ; môi trường production mở khóa những gì bạn đã mua. Kiểm tra với IDoconutLicenseService trước khi phát hành.

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