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:
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:
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:
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 (
.dcmvà.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:
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ăng | Cách kích hoạt | Khả năng | Đóng góp |
|---|---|---|---|
| Annotation | Tích hợp trong trình xem; bao gồm các tài nguyên chú thích | Annotation | Tạo nội dung trên trình duyệt, duy trì phiên, xuất bản có nhúng |
| Search | Tí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ếm | Search | Chỉ mục văn bản gốc, đánh dấu, điều hướng kết quả |
| Converter | Cài đặt Doconut.NETFramework.Converter và đăng ký ConverterPlugin | Converter | Dịch vụ chuyển đổi C# và một widget web tùy chọn |
| DICOM | Cài đặt Doconut.NETFramework.Dicom và đăng ký DicomPlugin | Dicom | Xem 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:
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ột500trố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
IDoconutLicenseServicetrước khi phát hành.
Trang này có hữu ích không?