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):
- Trocar o bloco
AddDevPackSigningKey/AddDevPackTokenService/AddDevPackDualSchemeporAddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(...)lendoAuthentication:Jwt. - Remover os slices
Application/Identity/*,AuthEndpointse oBffAntiforgeryMiddleware; reverterAppDbContextparaDbContextpuro. - Autorização (
RolePermissions+ resolver) eUseDevPackIdentityContext()permanecem intactas — a permissão continua resolvida por roles, independente de quem emitiu o token.
Seams de configuração (sem tocar código)
| Seam | Config |
|---|---|
| Rate limiting | RateLimiting:PermitLimit / WindowSeconds; políticas nomeadas por endpoint |
| CORS | Cors:AllowedOrigins (vazio = same-origin only) |
| Observabilidade | OTEL_EXPORTER_OTLP_* (padrão OpenTelemetry); OTEL_SDK_DISABLED=true para rodar sem collector |
| Signing key | Authentication:Token:SigningKeyPemPath (PEM em produção) |
| Admin bootstrap | Identity: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:
IPermissionEvaluatorcustom — quando lógica role-based não basta (claims, tenant, ownership). Ver Authorization.- Interceptors EF custom —
AddDevPackEfCoreInterceptors().WithInterceptor<T>(). Ver Infrastructure.EfCore. - Pipeline behaviors custom — registre
IPipelineBehavior<,>adicionais junto aos doAddDevPackBehaviors(). Ver Behaviors. - Cache distribuído — troque
IMemoryCacheporIDistributedCache(Redis) noDbRolePermissionResolverpara 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.