Pular para o conteúdo principal
Versão: 10.4.1

Extensibilidade

O template é opinativo, mas os pontos de extensão são deliberados. Esta página mapeia os seams oficiais — do mais comum ao mais invasivo.

Examples opt-in (examples/)

Features que demonstram padrões complementares ao canon vivem em examples/ no repo do template — são cópias opt-in, não viajam no dotnet new (ADR-005). Cada example tem README próprio com os padrões demonstrados e a receita de cópia passo-a-passo.

  • examples/Customers/ — campos únicos (Email, CPF) com pre-check no handler + índice único; value objects (Email, Cpf) que normalizam no construtor; desativação como transição de estado.

Trocar a autenticação: external JWT (resource server)

Para consumidores com IdP corporativo que querem o template validando token externo em vez de emitir os próprios (ADR-003):

  1. Trocar o bloco AddDevPackSigningKey/AddDevPackTokenService/AddDevPackDualScheme por AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(...) lendo Authentication:Jwt.
  2. Remover os slices Application/Identity/*, AuthEndpoints e o BffAntiforgeryMiddleware; reverter AppDbContext para DbContext puro.
  3. Autorização (RolePermissions + resolver) e UseDevPackIdentityContext() permanecem intactas — a permissão continua resolvida por roles, independente de quem emitiu o token.

Seams de configuração (sem tocar código)

SeamConfig
Rate limitingRateLimiting:PermitLimit / WindowSeconds; políticas nomeadas por endpoint
CORSCors:AllowedOrigins (vazio = same-origin only)
ObservabilidadeOTEL_EXPORTER_OTLP_* (padrão OpenTelemetry); OTEL_SDK_DISABLED=true para rodar sem collector
Signing keyAuthentication:Token:SigningKeyPemPath (PEM em produção)
Admin bootstrapIdentity:Admin:{Email,Password} (omitir para não seedar)
SPA build no publish-p:BuildSpaOnPublish=false, -p:SpaInstallCommand, -p:SpaBuildCommand

Extensão via DevPack

Boa parte da extensibilidade do template é, na verdade, extensibilidade da biblioteca:

  • IPermissionEvaluator custom — quando lógica role-based não basta (claims, tenant, ownership). Ver Authorization.
  • Interceptors EF customAddDevPackEfCoreInterceptors().WithInterceptor<T>(). Ver Infrastructure.EfCore.
  • Pipeline behaviors custom — registre IPipelineBehavior<,> adicionais junto aos do AddDevPackBehaviors(). Ver Behaviors.
  • Cache distribuído — troque IMemoryCache por IDistributedCache (Redis) no DbRolePermissionResolver para deployments multi-instância.

Cada página de feature do DevPack documenta a seção "Extensão pelo produto" com os pontos previstos.

Onde propor mudanças (G-01)

Regra de bolso antes de abrir PR: helper/regra útil a qualquer consumidor do DevPack → pertence ao DevPack; regra específica de como o canon estruturou → pertence ao template. Helpers que parecem template-specific frequentemente revelam-se universais — na dúvida, leia os ADRs dos dois repos.