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

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // por exemplo "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // o portão de licença
    void Register(IDoconutPluginBuilder builder); // contribuir visualizadores/serviços
}

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

Capacidades e restrição

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ção. 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 prevalece; 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, sem marca d'água). Esta é uma fonte clássica de surpresas no lançamento: 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() emitem os pacotes de script/estilo para os recursos restritos por licença (pesquisa, anotação, …) somente 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 UI do produto usa “plugin” como um rótulo amplo de recurso, mas o registro no servidor difere:

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

Anotação e Pesquisa normal não utilizam AddPlugin<TPlugin>(); seus pacotes são emitidos apenas quando a licença concede a capacidade correspondente. Conversor e DICOM são implementações IDoconutPlugin opcionais.

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:

csharp
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // implementa IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // config padrão opcional
});

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

Conclusões

  • Plugins são registrados explicitamente e seu LicenseCapability é validado durante AddDoconut() — elegibilidade ausente ou insuficiente não temporária falha rapidamente.
  • Plugins do tipo substituição degradam graciosamente; formatos exclusivos de plugin falham com um LicenseException.
  • Uma licença Temporária ativa desbloqueia tudo; a produção desbloqueia o que você comprou. Verifique com IDoconutLicenseService antes de enviar.

Esta página foi útil?