| Camada | Tecnologia | Versão | Notas |
|---|---|---|---|
| Runtime | .NET / C# | 10.0 / 14 | TargetFramework=net10.0, LangVersion=14 |
| Web | ASP.NET Core Minimal API | 10.0.9 | Microsoft.AspNetCore.OpenApi |
| Documentação | Scalar.AspNetCore | 2.16.4 | Substitui Swashbuckle (proibido) |
| Mensageria/CQRS | WolverineFx | 6.12.0 | DurabilityMode.MediatorOnly — sem inbox/outbox ativo |
| Validação | FluentValidation | 12.1.1 | WolverineFx.FluentValidation integrado |
| ORM | EF Core + Npgsql | 10.0.9 / 10.0.2 | UseSnakeCaseNamingConvention() (EFCore.NamingConventions 10.0.1) |
| Banco | PostgreSQL | 17 (pinado) | Dois schemas: public (domínio) e indexer (read-models Ponder) |
| Auth | Firebase JWT (OIDC) | JwtBearer 10.0.9 | Discovery via securetoken.google.com/<projectId> |
| SIWE / assinatura | Nethereum.Signer | 6.1.0 | EthereumMessageSigner.EncodeUTF8AndEcRecover |
| Paginação/filtro | Gridify | 2.19.1 | Mappers singleton por domínio; BigInteger type converter custom |
| Tempo real | SignalR (ASP.NET Core) | 10.0.9 (embutido) | EventsHub + MarketplaceEventsListener (LISTEN/NOTIFY) |
| Cache | IMemoryCache |
10.0.9 | TTL 30 s em GetSummaryHandler |
| Resiliência HTTP | Microsoft.Extensions.Http.Resilience |
10.7.0 | Retry + timeout + circuit-breaker via Polly (sem dep direta) |
| Observabilidade | OpenTelemetry | 1.16.0 | OTLP exporter + instrumentação ASP.NET/EF/HTTP/Npgsql |
| Orquestração dev | .NET Aspire | 13.4.5 (Aspire.Npgsql.*) |
RW.BC.AppHost (projeto separado) orquestra Postgres + API |
| Testes unitários | xUnit + FluentAssertions + Moq + AutoFixture | 2.9.3 / 8.10.0 / 4.20.72 / 4.18.1 | Domain + Application |
| Testes integração | Testcontainers.PostgreSql + WebApplicationFactory |
4.12.0 / 10.0.9 | Infrastructure + Api E2E |
Padrão Clean Architecture + Hexagonal em quatro camadas explícitas:
RW.BC.Domain (aggregates, value objects, building blocks — zero deps de framework)
^
RW.BC.Application (Wolverine handlers, commands, queries, DTOs, ports/interfaces, validators)
^
RW.BC.Infrastructure.Persistence (EF Core, repos, mappings de views, AuditingInterceptor, NethereumSignatureVerifier)
^
RW.BC.Api (Minimal API endpoints, Identity, Web helpers, SignalR hub, BackgroundService)
Alvo de deploy: sem alvo fixo neste repositório (build via imagem Docker, deployável em qualquer
orquestrador de containers); banco PostgreSQL 17 gerenciado.
Em dev local, o RW.BC.AppHost (Aspire) sobe Postgres + API + outros serviços do ecossistema com um único dotnet run.
CQRS: handlers Wolverine descobertos por opts.Discovery.IncludeAssembly(typeof(DIExtension).Assembly).
Wolverine roda em MediatorOnly — sem durabilidade persistida; IUnitOfWork.CommitAsync é chamado explicitamente nos handlers.
Read-models: views do schema indexer (populado pelo Ponder) mapeadas como ToView(...) no EF Core — somente leitura, sem migrations para essas views. Paginação/filtragem server-side via Gridify.