Sistema de Plugins

Estenda o visualizador com plugins

O núcleo do Doconut permanece enxuto; funcionalidades opcionais são entregues como plugins — pacotes NuGet separados que contribuem com visualizadores ou serviços e são ativados pela sua licença. Esta página explica o modelo de registro, como a restrição de licença se comporta em tempo de execução e como conectar seu próprio visualizador.

Registrando um plugin

Cada pacote de plugin expõe uma classe de plugin. Você a registra uma única vez, na inicialização:

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

AddPlugin<TPlugin>() instancia o plugin e invoca seu callback Register contra o registro de plugins mantido em DoconutOptions. Tudo o que um plugin contribui é marcado com a capacidade requerida do plugin. AddDoconut() valida os plugins registrados imediatamente: uma licença ausente, arquivo legado TRIAL ou licença paga sem a capacidade falham na inicialização com InvalidOperationException. Um registro Temporário/Demo é mantido após a expiração, mas suas capacidades em tempo de execução são revogadas após a data de expiração.

O contrato

Um plugin implementa uma interface deliberadamente pequena:

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
}

Dentro de Register, o construtor aceita dois tipos de contribuições:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — um visualizador para uma extensão de arquivo,
  • builder.RegisterService<TContract>(() => …) — um serviço tipado que outras partes do pipeline podem procurar.

Capacidades e restrição

As capacidades são as unidades de licença. Converter e Dicom são entregues como plugins opcionais; Search e Annotation são recursos incorporados restritos da mesma forma. O visualizador base não é uma capacidade — ele é o pré-requisito, exposto como IsViewerLicensed no serviço de licença.

A validação na inicialização normalmente impede que um plugin não licenciado entre no pipeline de requisições. A fábrica de visualizadores também aplica duas regras defensivas em tempo de execução, que são relevantes se a elegibilidade mudar após a inicialização:

  • Plugin substitui um visualizador incorporado (um plugin reivindica uma extensão que o registro incorporado também trata): com a capacidade licenciada, o visualizador do plugin tem prioridade; sem ela, Doconut recua silenciosamente para o visualizador incorporado. Os usuários ainda veem seu documento — apenas não obtêm o recurso do plugin.
  • Formato exclusivo de plugin (ex.: .dcm — DICOM não tem visualizador incorporado): sem a capacidade, a chamada de abertura falha de forma crítica:
text
LicenseException: This document type requires the 'Dicom' plugin license.

Uma licença Temporária ativa concede todas as capacidades (com visualização base limpa e sem marca d'água). Isso é uma fonte clássica de surpresas na implantação: registrar os mesmos plugins com uma licença comprada que omite uma de suas capacidades faz AddDoconut() falhar durante a inicialização. Compare IsCapabilityGranted(...) com seu plano antes de implantar. O lado oposto: com nenhuma licença, nada é concedido — uma licença ausente não é uma licença Temporária.

A mesma restrição aparece no lado do cliente: Viewer.ReferenceScripts() e ReferenceCss() geram os pacotes de script/estilo para os recursos restritos por licença (busca, anotação, …) apenas quando a licença os habilita, de modo que a UI do widget permanece consistente com o que o servidor realmente fará.

Mapa de recursos e plugins

A interface do produto usa “plugin” como um rótulo amplo de recurso, mas o registro no servidor difere:

RecursoComo é habilitadoCapacidadeContribui
AnotaçãoIntegrado ao visualizador; inclui recursos de anotaçãoAnnotationEdição no navegador, persistência de sessão e exportações incorporadas
BuscaIntegrado aos visualizadores de formatos pesquisáveis; inclui recursos de busca e habilita extração onde necessárioSearchÍndice de texto nativo, realces e navegação de resultados
ConversorInstale Doconut.NET8.Converter e registre ConverterPluginConverterServiço de conversão em C# e widget web opcional
DICOMInstale Doconut.NET8.Dicom e registre DicomPluginDicomVisualização de imagens médicas para .dcm e .ima

Pacotes de plugins lançados

PluginPacoteCapacidadeContribui
ConversorDoconut.NET8.ConverterConverterCapacidade de conversão de documentos
DICOMDoconut.NET8.DicomDicomVisualização de imagens médicas (.dcm — formato exclusivo de plugin)

Cada um tem uma página dedicada em Plugins com sua configuração e uso.

Visualizadores personalizados — seu próprio manipulador de formato

Você pode conectar um visualizador ao pipeline sem escrever um pacote de plugin, diretamente de Program.cs:

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

Visualizadores personalizados têm precedência sobre tudo — incorporados e plugins — e não são restritos por licença (são seu código). A fábrica recorre a um ImageConfig quando você não fornece uma configuração padrão.

Conclusões

  • Plugins são registrados explicitamente e sua LicenseCapability é validada durante AddDoconut() — falta ou insuficiência de direito não temporário falha rapidamente.
  • Plugins no estilo de sobrescrita degradam graciosamente; formatos exclusivos de plugin falham com uma LicenseException.
  • Uma licença Temporária ativa desbloqueia tudo; a licença de produção desbloqueia o que você comprou. Verifique com IDoconutLicenseService antes de distribuir.

Esta página foi útil?