Licenciamento
Recursos, níveis de licença e o serviço de licenças
Esta página é a referência em tempo de execução de como uma licença molda o comportamento da Doconut: o que cada estado de licença permite, como os recursos são concedidos e como inspecionar tudo isso a partir do código. (Para carregar uma licença, veja Introdução → Configuração de Licença.)
Estados da licença e o que eles fazem
| Estado | Abre documentos? | Marca d'água | Recursos |
|---|---|---|---|
| Licença completa (paga) (dentro da sua janela de assinatura/atualização) | Sim | Nenhum | As adquiridas (Has* flags) |
| Licença temporária (Desenvolvedor/NFR — a licença de avaliação, antes da data de expiração) | Sim | Nenhum | Todas — concessão geral (o funil de avaliação) |
| Expirada (uma licença temporária após sua data de expiração, ou uma assinatura paga após sua data de renovação) | Sim | Marca d'água de avaliação | Nenhum concedido |
| Nenhum arquivo de licença | Sim | Marca d'água de avaliação | Nenhum concedido |
| Encontrada mas rejeitada (assinatura inválida, adulterada, na lista negra, ou uma compilação mais nova que a janela de versão da licença) | Não — LicenseException em cada abertura | — | — |
Duas consequências que vale a pena internalizar:
- Uma licença ausente não é uma licença temporária. Sem arquivo de licença, as páginas são renderizadas com marca d'água e nenhum recurso (pesquisa, anotação, plugins) está ativo. A experiência completa, sem marca d'água, requer uma Licença temporária (obtenha uma).
- Só uma licença rejeitada bloqueia a abertura. O vencimento do calendário/assinatura degrada para renderização com marca d'água; mas implantar uma compilação mais nova que a janela de versão da licença é rejeitado e falha rapidamente com um
LicenseException, assim você a captura no deploy — não enviando silenciosamente saída com marca d'água. Essa exceção (deOpenDocumentAsync) traz a razão deLicense.RejectionMessage.
Recursos
Doconut controla a funcionalidade opcional por recurso. Hoje são os plugins opcionais Converter e DICOM, além dos recursos integrados Search e Annotation, cada um concedido pela sua licença. O visualizador base não é um recurso — ele é o pré-requisito, exposto como IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionO único ponto de verificação que todo o pipeline usa é IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Sua lógica, palavra por palavra da implementação: uma licença temporária ativa (não expirada) concede todos os recursos — incluindo recursos que ainda não têm uma flag de compra dedicada; uma licença realmente comprada concede exatamente suas flags Has* e tem negação padrão para qualquer coisa não mapeada. (Um arquivo legado do tipo TRIAL não é um direito — ele é tratado como não licenciado: com marca d'água, nada concedido.)
Licenças temporárias
Licenças temporárias (Desenvolvedor/NFR) são marcadas por uma tag ExpiryNote e possuem uma data de expiração fixa:
| Membro | Significado |
|---|---|
IsTemporary | Uma tag ExpiryNote está presente (a detecção é pela presença da tag — nunca compare o texto da nota, é dinâmico) |
ExpiryNote | Texto informativo incorporado na licença |
LicenseExpiry | A data de expiração fixa (DateTime?) |
A semântica de expiração difere por nível: uma licença temporária expira na data do seu LicenseExpiry (sua janela de assinatura é ignorada; uma licença temporária sem data é tratada como expirada, como medida de segurança). Todas as demais licenças expiram na data da sua janela de assinatura/atualização.
Referência IDoconutLicenseService
Injete IDoconutLicenseService (namespace Doconut.Core.Interfaces; registrado como singleton — a licença é analisada uma vez na inicialização):
| Membro | Significado |
|---|---|
License | Captura completa de DoconutLicenseInfo (abaixo) |
IsTrial | Um arquivo legado do tipo TRIAL (tratado como não licenciado — não um direito) |
IsTemporary / ExpiryNote / LicenseExpiry | Marcadores de licença temporária |
IsExpired | Expirada conforme as regras de nível acima |
IsVersionValid | Esta compilação está dentro da janela de suporte da licença |
IsViewerLicensed | Arquivo não-TRIAL encontrado e versão coberta — pré-requisito base |
IsCapabilityGranted(cap) | O único ponto de verificação de recurso |
HasSearch HasAnnotation HasConverter HasDicom | Flags de compra por recurso — use IsCapabilityGranted para a resposta consciente de temporária |
IsValidForDomain(host) | Cobertura de host; licenças V4 usam o curinga *.* |
LicenseRejectionReason | Não vazio ⇒ a abertura é bloqueada com esta mensagem |
DoconutLicenseInfo expõe a captura amigável para exibição em painéis administrativos: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, as flags Has*, os campos de licença temporária e RejectionMessage.
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}));Verificação de saúde
AddDoconut() registra uma verificação de saúde "doconut" que relata o estado da licença/expiração através do mecanismo padrão do ASP.NET Core:
app.MapHealthChecks("/health");Conecte-a ao seu monitoramento e uma assinatura que está expirando se torna um alerta em vez de um ticket de suporte.
Atualizações de versão
Uma licença cobre uma janela de versão. Atualizar o pacote NuGet para uma compilação mais nova que essa janela torna a licença inválida para essa compilação: IsVersionValid passa a false e a abertura é bloqueada com um LicenseException (a razão está em License.RejectionMessage) — falha rápida deliberada, para que uma compilação obsoleta ou não licenciada seja detectada no deploy ao invés de marcar silenciosamente a produção com marca d'água. Renove a assinatura, substitua o .lic e reinicie a aplicação para que AddDoconut() carregue a nova licença.
Esta página foi útil?