Extensions¶
Shared .NET 11 backend library for all Recron microservices. Published as 3 NuGet packages to GitHub Packages.
- Repository: JanKrajewskiIT/extensions
- Registry: NuGet (GitHub Packages)
- Version:
1.1.4(centralized inDirectory.Build.props)
For how Recron consumes these packages, see Shared Packages.
Packages¶
graph LR
API["API Projects"] --> EI[Extensions.Infrastructure]
EI --> ED[Extensions.Domain]
EI --> EA[Extensions.Application]
Extensions.Application¶
CQRS abstractions with zero dependencies:
ICommand,ICommand<TResponse>,IQuery<TResponse>ICommandHandler<T>,ICommandHandler<T, TResponse>,IQueryHandler<T, TResponse>- Pagination abstractions
Extensions.Domain¶
Domain building blocks:
AuditEntity— base entity withCreatedAt,ModifiedAt,CreatedBy,ModifiedByBaseEntity— base entity withIdICurrentUserService— abstraction for current user contextRoles— role constants (Admin,Moderator,User)- Domain exception types
Extensions.Infrastructure¶
Cross-cutting concerns (references both Application and Domain):
| Module | Purpose |
|---|---|
Ai/ |
OpenAI integration via Aspire |
Caching/ |
HybridCache configuration |
Cors/ |
CORS policy setup |
Database/ |
PostgreSQL + EF Core DbContextBase, audit interceptor, user-scoped entities |
Handlers/ |
CQRS handler dispatching |
Http/ |
HTTP resilience and service discovery |
Metrics/ |
OpenTelemetry + Serilog observability |
OpenApi/ |
Scalar API documentation setup |
RateLimiting/ |
Rate limiting middleware |
Security/ |
Keycloak JWT authentication, UserContext, authorization policies |
Validation/ |
FluentValidation integration |
ConfigurationExtensions.cs ties everything together with a single service registration call.
Structure¶
Extensions/
├── Extensions.Application/ # CQRS abstractions
│ ├── Abstractions/
│ └── Pagination/
├── Extensions.Domain/ # Domain building blocks
│ ├── Abstractions/
│ ├── Entities/
│ └── Exceptions/
├── Extensions.Infrastructure/ # Cross-cutting concerns
│ ├── Ai/
│ ├── Caching/
│ ├── Cors/
│ ├── Database/
│ ├── Handlers/
│ ├── Http/
│ ├── Metrics/
│ ├── OpenApi/
│ ├── RateLimiting/
│ ├── Security/
│ └── Validation/
├── Directory.Build.props # Version + shared build settings
├── Directory.Packages.props # Centralized dependency versions
├── nuget.config # GitHub Packages source
└── Extensions.slnx # Solution file
Install¶
Each API project references only Extensions.Infrastructure (which transitively brings Application and Domain):
NuGet is configured to fetch from GitHub Packages. See Getting Started for authentication setup.
Key Dependencies¶
| Category | Packages |
|---|---|
| Database | Npgsql.EntityFrameworkCore.PostgreSQL, Microsoft.EntityFrameworkCore |
| Validation | FluentValidation |
| Auth | Microsoft.AspNetCore.Authentication.JwtBearer |
| Observability | OpenTelemetry (ASP.NET Core, HTTP, Runtime), Serilog |
| Caching | Microsoft.Extensions.Caching.Hybrid |
| Resilience | Microsoft.Extensions.Http.Resilience |
| AI | Aspire.OpenAI |
CI/CD¶
Packages are published to GitHub Packages on push to main or tags matching v* via .github/workflows/publish-nuget.yml.
Pipeline: restore → build (Release) → pack all 3 packages → publish to GitHub Packages
Required secrets:
| Secret | Description |
|---|---|
GHCR_TOKEN |
GitHub PAT with read:packages + write:packages |