Licenciamento

Recursos, níveis de licença e o serviço de licença

Esta página é a referência em tempo de execução de como uma licença molda o comportamento do 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 de licença e o que eles fazem

EstadoAbre documentos?Marca d'águaRecursos
Licença completa (paga) (dentro da sua janela de assinatura/atualização)SimNenhumAs adquiridas (Has* flags)
Licença temporária (Desenvolvedor/NFR — a licença de avaliação, antes da data de expiração)SimNenhumTodas — concessão total (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)SimMarca d'água de avaliaçãoNenhum concedido
Nenhum arquivo de licençaSimMarca d'água de avaliaçãoNenhum 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——

Dois efeitos importantes a 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 um).
  • Só uma licença rejeitada bloqueia a abertura. O vencimento do calendário/assinatura regride 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, de modo que você o captura no deploy — não ao enviar silenciosamente saída com marca d'água. Essa exceção (de OpenDocumentAsync) traz o motivo de License.RejectionMessage.

Recursos

Doconut controla a funcionalidade opcional por recurso. Hoje são os plugins opt-in Converter e DICOM, além dos recursos embutidos Pesquisa e Anotação, cada um concedido pela sua licença. O visualizador base não é um recurso — ele é o pré-requisito, exposto como IsViewerLicensed:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // licença non-TRIAL presente E cobrindo a versão desta build

O único ponto de controle que todo o pipeline usa é IsCapabilityGranted:

csharp
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);

Sua lógica, literalmente 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 bandeira de compra dedicada; uma licença comprada real concede exatamente suas bandeiras 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

Pesquisa e Anotação normais usam seus recursos existentes diretamente.

Licenças temporárias (Desenvolvedor/NFR) são marcadas por uma etiqueta ExpiryNote e possuem uma data de expiração rígida:

MembroSignificado
IsTemporaryUma etiqueta ExpiryNote está presente (a detecção é por presença da etiqueta — nunca corresponde ao texto da nota, é dinâmica)
ExpiryNoteTexto informativo incorporado na licença
LicenseExpiryA data de expiração rígida (DateTime?)

A semântica de expiração difere por nível: uma licença temporária expira na sua LicenseExpiry apenas data (sua janela de assinatura é ignorada; uma licença temporária sem a data é tratada como expirada, à prova de falhas). 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):

MembroSignificado
LicenseInstantâneo completo DoconutLicenseInfo (abaixo)
IsTrialUm arquivo legado do tipo TRIAL (tratado como não licenciado — não é um direito)
IsTemporary / ExpiryNote / LicenseExpiryMarcadores de licença temporária
IsExpiredExpirada conforme as regras de nível acima
IsVersionValidEsta compilação está dentro da janela de suporte da licença
IsViewerLicensedArquivo não-TRIAL encontrado e versão coberta — pré-requisito base
IsCapabilityGranted(cap)O único ponto de controle de recurso
HasSearch HasAnnotation HasConverter HasDicomBandeiras de compra liberadas por recurso — use IsCapabilityGranted para a resposta consciente de temporária
IsValidForDomain(host)Cobertura de host; licenças V4 usam o curinga *.*
LicenseRejectionReasonNão vazio ⇒ a abertura é bloqueada com esta mensagem

DoconutLicenseInfo expõe o instantâneo amigável para exibição em painéis de administração: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, as bandeiras Has*, os campos de licença temporária, e RejectionMessage.

csharp
// Feature-flag sua UI a partir da mesma fonte de verdade que o SDK usa
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:

csharp
app.MapHealthChecks("/health");

Integre-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 transforma false e a abertura é bloqueada com um LicenseException (o motivo está em License.RejectionMessage) — falha rápida deliberada, para que uma compilação obsoleta ou não licenciada seja detectada no deploy em vez de marcar silenciosamente a saída de produção. Renove a assinatura, substitua o .lic e reinicie a aplicação para que AddDoconut() carregue a nova licença.

Esta página foi útil?