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:
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:
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:
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:
| Recurso | Como é habilitado | Capacidade | Contribui |
|---|---|---|---|
| Anotação | Integrado ao visualizador; inclui recursos de anotação | Annotation | Edição no navegador, persistência de sessão e exportações incorporadas |
| Busca | Integrado aos visualizadores de formatos pesquisáveis; inclui recursos de busca e habilita extração onde necessário | Search | Índice de texto nativo, realces e navegação de resultados |
| Conversor | Instale Doconut.NET8.Converter e registre ConverterPlugin | Converter | Serviço de conversão em C# e widget web opcional |
| DICOM | Instale Doconut.NET8.Dicom e registre DicomPlugin | Dicom | Visualização de imagens médicas para .dcm e .ima |
Pacotes de plugins lançados
| Plugin | Pacote | Capacidade | Contribui |
|---|---|---|---|
| Conversor | Doconut.NET8.Converter | Converter | Capacidade de conversão de documentos |
| DICOM | Doconut.NET8.Dicom | Dicom | Visualizaçã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:
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 duranteAddDoconut()— 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
IDoconutLicenseServiceantes de distribuir.
Esta página foi útil?