ADR 001 — Sem wrappers de framework no DevPack
Status: Accepted
Data: 2026-04-23
Contexto
O ITLab.Template.DevPack é um pacote NuGet compartilhado que serve como esqueleto técnico para projetos nascidos do ITLab.Template. Durante a extração do DevPack a partir do ITLab.WorkGuardian.SharedKernel, surgiu a questão de até onde o pacote deveria ir: apenas abstrações e utilitários genéricos, ou também wrappers sobre frameworks como EF Core, Serilog, SignalR, etc.
Decisão
O DevPack não cria wrappers sobre frameworks externos. Ele expõe diretamente as dependências de framework com as quais os projetos consumidores devem interagir.
Exemplos do que o DevPack faz:
- Expõe interfaces genéricas (
IRepository<T>,IUnitOfWork,ICurrentUser,IDateTimeProvider) - Fornece behaviors de pipeline
Mediator(ValidationPipelineBehavior,RequestLoggingPipelineBehavior,NormalizeDateTimeOffsetBehavior) - Fornece interceptors EF Core base (
AuditableEntityInterceptor,SoftDeleteInterceptor,DispatchDomainEventsInterceptor) - Oferece extensões utilitárias puras (
DateTimeOffsetExtensions,StringExtensions,GuardExtensions, etc.) - Exporta classes de AppSettings tipadas com
IAppOptions(ApplicationOptions,JwtOptions,LdapOptions, etc.)
Exemplos do que o DevPack não faz:
- Não cria
ILogger<T>wrappers — os consumidores usam o Serilog/Microsoft.Extensions.Logging diretamente - Não cria abstrações sobre
IMemoryCachealém das extensões utilitárias já existentes - Não cria factories ou builders para registrar serviços no DI — cada projeto tem seu próprio
Program.cs - Não encapsula
HttpClient,IEmailSender,ISlackClientatrás de interfaces adicionais — as abstrações genéricas de notificação (NotificationRecipientDto,ENotificationFormat) são suficientes
Justificativa
-
Acoplamento desnecessário: wrappers adicionam uma camada indirecta que dificulta debugging e aumenta a superfície de testes sem agregar valor real.
-
Vazamento de abstração: frameworks como EF Core, Serilog e SignalR têm APIs ricas e bem documentadas. Wrappers simplificados invariavelmente limitam o acesso a recursos avançados.
-
Facilidade de atualização: sem wrappers, atualizar a versão de uma dependência de framework exige apenas bumpar o número de versão no
ITLab.Template.DevPack.csproj, sem reescrever código intermediário. -
Princípio de menor surpresa: consumidores que já conhecem os frameworks não precisam aprender uma API adicional específica do DevPack.
Consequências
- Projetos consumidores importam e usam os frameworks diretamente, o que é esperado e documentado.
- O DevPack foca em ser um ponto de entrada consistente (convenções, behaviors, interceptors, configurações) sem ser um invólucro completo.
- Novos tipos adicionados ao DevPack devem passar pelo critério: "isso seria útil em qualquer projeto .NET do ITLab, independente do domínio de negócio?" Se a resposta for não, pertence ao projeto específico, não ao DevPack.