Skip to content

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 in Directory.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 with CreatedAt, ModifiedAt, CreatedBy, ModifiedBy
  • BaseEntity — base entity with Id
  • ICurrentUserService — abstraction for current user context
  • Roles — 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):

<PackageReference Include="Extensions.Infrastructure" Version="1.0.*" />

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