Skip to content

nghia0coder/aiva-admin-api

Repository files navigation

Aiva.Admin.Api

A modern .NET 10 API solution built with Clean Architecture principles, Domain-Driven Design (DDD), and orchestrated with .NET Aspire for cloud-ready microservices development.

πŸ“ Note: This project is based on the Ardalis Clean Architecture Template, I adjusted a little bit in Presentention Layer by group into folder (It's just personal preference). For more information about the template and its design decisions, please visit the official repository.

πŸ—οΈ Architecture Overview

This project implements Clean Architecture with a hybrid approach combining:

  • Clean Architecture for core business logic and application layers
  • Vertical Slice Architecture for API endpoints using FastEndpoints
  • Domain-Driven Design (DDD) patterns in the domain layer
  • .NET Aspire for distributed application orchestration

Architectural Layers

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Presentation Layer                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Aiva.Admin.Api.Web (FastEndpoints)                β”‚ β”‚
β”‚  β”‚  - API Endpoints (Vertical Slices)                 β”‚ β”‚
β”‚  β”‚  - Request/Response DTOs                           β”‚ β”‚
β”‚  β”‚  - Validators                                      β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Application Layer                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Aiva.Admin.Api.UseCases (CQRS Pattern)            β”‚ β”‚
β”‚  β”‚  - Commands (Create, Update, Delete)               β”‚ β”‚
β”‚  β”‚  - Queries (Get, List)                             β”‚ β”‚
β”‚  β”‚  - DTOs and Mappers                                β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Domain Layer                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Aiva.Admin.Api.Core (Business Logic)              β”‚ β”‚
β”‚  β”‚  - Entities & Aggregates                           β”‚ β”‚
β”‚  β”‚  - Value Objects                                   β”‚ β”‚
β”‚  β”‚  - Domain Events                                   β”‚ β”‚
β”‚  β”‚  - Specifications                                  β”‚ β”‚
β”‚  β”‚  - Domain Services                                 β”‚ β”‚
β”‚  β”‚  - Repository Interfaces                           β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β–²
                          β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 Infrastructure Layer                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Aiva.Admin.Api.Infrastructure                     β”‚ β”‚
β”‚  β”‚  - EF Core DbContext & Repositories                β”‚ β”‚
β”‚  β”‚  - Database Migrations                             β”‚ β”‚
β”‚  β”‚  - External Service Implementations                β”‚ β”‚
β”‚  β”‚  - Email Services (Papercut/MimeKit)               β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Supporting Projects

  • Aiva.Admin.Api.AspireHost: Orchestration layer using .NET Aspire for managing distributed services and dependencies
  • Aiva.Admin.Api.ServiceDefaults: Shared service configurations (OpenTelemetry, health checks, logging)

πŸ“ Project Structure

Aiva.Admin.Api/
β”‚
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ Aiva.Admin.Api.AspireHost/        # .NET Aspire orchestration
β”‚   β”‚   β”œβ”€β”€ Program.cs                     # Service orchestration configuration
β”‚   β”‚   └── Properties/launchSettings.json # Launch profiles (including WSL support)
β”‚   β”‚
β”‚   β”œβ”€β”€ Aiva.Admin.Api.Web/                # API Presentation Layer
β”‚   β”‚   β”œβ”€β”€ Contributors/                  # Feature: Contributor endpoints (Vertical Slices)
β”‚   β”‚   β”‚   β”œβ”€β”€ Create/                    # Create contributor endpoint + validator
β”‚   β”‚   β”‚   β”œβ”€β”€ Update/                    # Update contributor endpoint + validator
β”‚   β”‚   β”‚   β”œβ”€β”€ Delete/                    # Delete contributor endpoint + validator
β”‚   β”‚   β”‚   β”œβ”€β”€ Get/                       # Get by ID endpoint + validator
β”‚   β”‚   β”‚   └── List/                      # List contributors endpoint + validator
β”‚   β”‚   β”œβ”€β”€ Configurations/                # Startup configurations
β”‚   β”‚   └── Program.cs                     # Application entry point
β”‚   β”‚
β”‚   β”œβ”€β”€ Aiva.Admin.Api.UseCases/           # Application Layer (Use Cases)
β”‚   β”‚   β”œβ”€β”€ Contributors/                  # Contributor use cases (CQRS)
β”‚   β”‚   β”‚   β”œβ”€β”€ Create/                    # CreateContributorCommand + Handler
β”‚   β”‚   β”‚   β”œβ”€β”€ Update/                    # UpdateContributorCommand + Handler
β”‚   β”‚   β”‚   β”œβ”€β”€ Delete/                    # DeleteContributorCommand + Handler
β”‚   β”‚   β”‚   β”œβ”€β”€ Get/                       # GetContributorQuery + Handler
β”‚   β”‚   β”‚   β”œβ”€β”€ List/                      # ListContributorsQuery + Handler
β”‚   β”‚   β”‚   └── ContributorDTO.cs          # Shared DTO
β”‚   β”‚   └── PagedResult.cs                 # Pagination support
β”‚   β”‚
β”‚   β”œβ”€β”€ Aiva.Admin.Api.Core/               # Domain Layer
β”‚   β”‚   β”œβ”€β”€ ContributorAggregate/          # Contributor aggregate root
β”‚   β”‚   β”‚   β”œβ”€β”€ Contributor.cs             # Entity with business rules
β”‚   β”‚   β”‚   β”œβ”€β”€ ContributorId.cs           # Strongly-typed ID (Value Object)
β”‚   β”‚   β”‚   β”œβ”€β”€ ContributorName.cs         # Value Object
β”‚   β”‚   β”‚   β”œβ”€β”€ PhoneNumber.cs             # Value Object
β”‚   β”‚   β”‚   β”œβ”€β”€ ContributorStatus.cs       # Enumeration
β”‚   β”‚   β”‚   β”œβ”€β”€ Events/                    # Domain events
β”‚   β”‚   β”‚   β”œβ”€β”€ Handlers/                  # Domain event handlers
β”‚   β”‚   β”‚   └── Specifications/            # Query specifications
β”‚   β”‚   β”œβ”€β”€ Interfaces/                    # Repository & service abstractions
β”‚   β”‚   └── Services/                      # Domain services
β”‚   β”‚
β”‚   β”œβ”€β”€ Aiva.Admin.Api.Infrastructure/     # Infrastructure Layer
β”‚   β”‚   β”œβ”€β”€ Data/
β”‚   β”‚   β”‚   β”œβ”€β”€ AppDbContext.cs            # EF Core DbContext
β”‚   β”‚   β”‚   β”œβ”€β”€ EfRepository.cs            # Generic repository implementation
β”‚   β”‚   β”‚   β”œβ”€β”€ EventDispatcherInterceptor.cs # Domain event dispatcher
β”‚   β”‚   β”‚   β”œβ”€β”€ Migrations/                # EF Core migrations
β”‚   β”‚   β”‚   β”œβ”€β”€ Config/                    # Entity configurations
β”‚   β”‚   β”‚   └── Queries/                   # Read-optimized queries
β”‚   β”‚   └── Email/                         # Email service implementations
β”‚   β”‚
β”‚   └── Aiva.Admin.Api.ServiceDefaults/    # Shared configurations
β”‚       └── Extensions.cs                  # OpenTelemetry, health checks, etc.
β”‚
└── tests/
    β”œβ”€β”€ Aiva.Admin.Api.UnitTests/          # Unit tests (15 tests)
    β”‚   β”œβ”€β”€ Core/                          # Domain model tests
    β”‚   └── UseCases/                      # Use case handler tests
    β”‚
    β”œβ”€β”€ Aiva.Admin.Api.IntegrationTests/   # Integration tests
    β”‚   └── Data/                          # Repository & database tests
    β”‚
    β”œβ”€β”€ Aiva.Admin.Api.FunctionalTests/    # End-to-end API tests (3 tests)
    β”‚   β”œβ”€β”€ ApiEndpoints/                  # API endpoint tests
    β”‚   └── CustomWebApplicationFactory.cs # Testcontainers setup
    β”‚
    └── Aiva.Admin.Api.AspireTests/        # Aspire orchestration tests
        └── AspireIntegrationTests.cs      # Service startup & health tests

πŸš€ Technologies & Frameworks

Core Technologies

  • .NET 10 - Latest .NET platform
  • C# 13 - Latest C# language features
  • ASP.NET Core - Web framework

Architectural Patterns

  • Clean Architecture - Separation of concerns with dependency inversion
  • Domain-Driven Design (DDD) - Rich domain models with aggregates and value objects
  • CQRS - Command Query Responsibility Segregation pattern
  • Vertical Slice Architecture - Feature-focused endpoint organization

Key Libraries & Frameworks

API & Presentation

  • FastEndpoints - High-performance, developer-friendly alternative to MVC controllers
  • Swagger/OpenAPI - API documentation and testing

Application Layer

  • MediatR - Mediator pattern implementation for CQRS
  • FluentValidation - Validation library integrated with FastEndpoints
  • Ardalis.Result - Result pattern for better error handling

Domain Layer

  • Ardalis.Specification - Repository pattern with specification support
  • Ardalis.GuardClauses - Guard clauses for defensive programming
  • Ardalis.SmartEnum - Type-safe enum alternatives

Infrastructure

  • Entity Framework Core - ORM for database access
  • SQL Server - Primary database (via Aspire orchestration)
  • SQLite - Fallback database for standalone runs
  • MimeKit - Email sending
  • Papercut SMTP - Email testing during development

Orchestration & Observability

  • .NET Aspire - Cloud-ready application orchestration
  • OpenTelemetry - Distributed tracing and metrics
  • Serilog - Structured logging

Testing

  • xUnit - Test framework
  • FluentAssertions - Fluent assertion library
  • Testcontainers - Docker containers for integration testing
  • Moq/NSubstitute - Mocking libraries

🎯 Key Design Principles

1. Clean Architecture

  • Dependency Rule: Dependencies point inward toward the domain
  • Core business logic has no dependencies on external frameworks
  • Infrastructure and UI depend on abstractions defined in Core

2. Domain-Driven Design

  • Aggregates: Related entities grouped together (e.g., Contributor aggregate)
  • Value Objects: Immutable objects representing domain concepts (e.g., ContributorName, PhoneNumber)
  • Domain Events: Communicate changes within the domain
  • Specifications: Reusable query logic encapsulated in the domain

3. CQRS Pattern

  • Commands: Mutate state (Create, Update, Delete)
  • Queries: Fetch data without side effects (Get, List)
  • Clear separation improves testability and scalability

4. Vertical Slice Architecture (for Endpoints)

  • Each feature endpoint contains:
    • Request/Response models
    • Validators
    • Endpoint handler
  • Reduces coupling between features
  • Makes features easier to understand and modify

5. Parse, Don't Validate

  • Value objects validate data at construction time
  • Invalid objects cannot exist in the system
  • Type safety at compile time

πŸ› οΈ Getting Started

Prerequisites

  • .NET 9 SDK - Download
  • Docker Desktop - Required for .NET Aspire containers and Testcontainers
  • Visual Studio 2022 (v17.12+) or Visual Studio Code with C# extensions
  • SQL Server Management Studio (optional) - For database inspection

Installation & Setup

  1. Clone the repository

    git clone <repository-url>
    cd Aiva.Admin.Api
  2. Restore dependencies

    dotnet restore
  3. Build the solution

    dotnet build

Running the Application

Option 1: Run with .NET Aspire (Recommended)

This will start SQL Server and Papercut containers automatically:

# Set AspireHost as startup project and run
cd src/Aiva.Admin.Api.AspireHost
dotnet run

The Aspire Dashboard will open in your browser showing:

  • SQL Server container (port 1433)
  • Papercut SMTP server (SMTP: port 25, UI: port 37408)
  • Web API application
  • Health checks, metrics, and distributed tracing

Access Points:

  • Aspire Dashboard: https://localhost:17021 (or as shown in console)
  • Web API: https://localhost:7071 or http://localhost:5071
  • Swagger UI: https://localhost:7071/swagger
  • Papercut Email UI: http://localhost:37408

Option 2: Run Web API Standalone

This will use SQLite as the database:

cd src/Aiva.Admin.Api.Web
dotnet run

Access Points:

  • Web API: https://localhost:7071
  • Swagger UI: https://localhost:7071/swagger

Option 3: Visual Studio

  1. Set Aiva.Admin.Api.AspireHost as the startup project
  2. Press F5 or click "Start Debugging"
  3. The Aspire Dashboard will automatically open

Database Migrations

Migrations are applied automatically on application startup. To create new migrations:

# From the solution root
cd src/Aiva.Admin.Api.Web

# Create a new migration
dotnet ef migrations add MigrationName \
  -c AppDbContext \
  -p ../Aiva.Admin.Api.Infrastructure/Aiva.Admin.Api.Infrastructure.csproj \
  -s Aiva.Admin.Api.Web.csproj \
  -o Data/Migrations

# Apply migrations manually (if needed)
dotnet ef database update \
  -c AppDbContext \
  -p ../Aiva.Admin.Api.Infrastructure/Aiva.Admin.Api.Infrastructure.csproj \
  -s Aiva.Admin.Api.Web.csproj

Running with WSL (Windows Subsystem for Linux)

If you're using Docker in WSL, use the WSL-specific launch profiles:

# From AspireHost directory
dotnet run --launch-profile https-wsl

Or in Visual Studio, select the https-wsl profile from the dropdown.

See Aspire Host README for detailed WSL configuration.

πŸ§ͺ Testing Strategy

The solution includes comprehensive testing at multiple levels:

Test Projects

  1. Unit Tests (Aiva.Admin.Api.UnitTests) - 15 tests

    • Domain model tests (entities, value objects)
    • Use case handler tests (isolated with mocks)
    • Fast execution, no external dependencies
  2. Integration Tests (Aiva.Admin.Api.IntegrationTests)

    • Repository tests with real database
    • Data access logic validation
    • EF Core behavior verification
  3. Functional Tests (Aiva.Admin.Api.FunctionalTests) - 3 tests

    • End-to-end API endpoint testing
    • Uses Testcontainers with SQL Server 2022
    • Each test gets isolated containerized database
    • Validates migrations work correctly
  4. Aspire Tests (Aiva.Admin.Api.AspireTests)

    • Service orchestration tests
    • Container startup and health verification

Running Tests

# Run all tests
dotnet test

# Run specific test project
dotnet test tests/Aiva.Admin.Api.UnitTests

# Run with code coverage
dotnet test --collect:"XPlat Code Coverage"

# Run tests in parallel (configured via .runsettings)
dotnet test --settings .runsettings

Parallel Test Execution

The solution is configured for parallel test execution:

  • Test assemblies run in parallel (uses all CPU cores)
  • Test collections within each assembly also run in parallel
  • See PARALLEL_TEST_EXECUTION.md for configuration details

Testcontainers Implementation

Functional tests use Testcontainers for realistic database testing:

  • Real SQL Server 2022 running in Docker containers
  • Automatic container lifecycle management
  • Isolated database per test class
  • See TESTCONTAINERS_IMPLEMENTATION.md for details

Requirements:

  • Docker Desktop must be running
  • First run downloads SQL Server image (~1.5 GB)

πŸ“‹ API Endpoints

All endpoints follow RESTful conventions and are documented via Swagger.

Contributors API

Method Endpoint Description
GET /contributors List all contributors (with pagination)
GET /contributors/{id} Get contributor by ID
POST /contributors Create new contributor
PUT /contributors/{id} Update existing contributor
DELETE /contributors/{id} Delete contributor

Sample Request (Create Contributor):

POST /contributors
{
  "name": "John Doe",
  "phoneNumber": "+1234567890",
  "status": 1
}

Sample Response:

{
  "id": 1,
  "name": "John Doe",
  "phoneNumber": "+1234567890",
  "status": 1
}

Access the interactive API documentation at /swagger when running the application.

πŸ“š Documentation

Additional documentation files:

πŸ”§ Development Workflow

Adding a New Feature (e.g., "Projects")

  1. Create Domain Entities (Core project)

    Core/ProjectAggregate/
    β”œβ”€β”€ Project.cs              # Aggregate root
    β”œβ”€β”€ ProjectId.cs            # Value object
    β”œβ”€β”€ ProjectName.cs          # Value object
    β”œβ”€β”€ Events/                 # Domain events
    └── Specifications/         # Query specifications
    
  2. Add Database Configuration (Infrastructure project)

    // Infrastructure/Data/Config/ProjectConfiguration.cs
    public class ProjectConfiguration : IEntityTypeConfiguration<Project>
  3. Create Use Cases (UseCases project)

    UseCases/Projects/
    β”œβ”€β”€ ProjectDTO.cs
    β”œβ”€β”€ Create/
    β”‚   β”œβ”€β”€ CreateProjectCommand.cs
    β”‚   └── CreateProjectHandler.cs
    β”œβ”€β”€ List/
    β”‚   β”œβ”€β”€ ListProjectsQuery.cs
    β”‚   └── ListProjectsHandler.cs
    └── ...
    
  4. Add API Endpoints (Web project)

    Web/Projects/
    β”œβ”€β”€ Create/
    β”‚   β”œβ”€β”€ Create.cs              # FastEndpoint
    β”‚   β”œβ”€β”€ CreateProjectRequest.cs
    β”‚   β”œβ”€β”€ CreateProjectResponse.cs
    β”‚   └── CreateProjectValidator.cs
    β”œβ”€β”€ List/
    └── ...
    
  5. Write Tests

    • Unit tests for domain logic
    • Integration tests for repositories
    • Functional tests for API endpoints
  6. Create Migration

    dotnet ef migrations add AddProjectAggregate

Code Style Guidelines

  • Follow C# coding conventions
  • Use meaningful names (domain language)
  • Keep methods small and focused
  • Write tests before or alongside implementation
  • Use guard clauses for validation
  • Leverage value objects to avoid primitive obsession

🏒 Enterprise Best Practices

This solution demonstrates enterprise-grade practices:

βœ… Separation of Concerns - Clear boundaries between layers
βœ… Dependency Inversion - Core depends on abstractions, not implementations
βœ… Testability - High test coverage with fast unit tests
βœ… Maintainability - Features organized by vertical slices
βœ… Observability - OpenTelemetry integration for distributed tracing
βœ… Container Ready - Docker support with .NET Aspire
βœ… Type Safety - Value objects and strongly-typed IDs
βœ… Domain-Centric - Business logic in domain layer, not scattered
βœ… CQRS - Optimized read and write paths
βœ… Realistic Testing - Testcontainers for database integration tests

🀝 Contributing

  1. Create a feature branch
  2. Write tests for new functionality
  3. Ensure all tests pass
  4. Follow existing code structure and naming conventions
  5. Submit a pull request

πŸ“„ License

See LICENSE file for details.

πŸ”— Resources & References

πŸ“ž Support

For questions or support:

  • Check existing documentation in project README files
  • Review architectural decision records
  • Contact: NimblePros

Built with ❀️ using Clean Architecture principles and modern .NET practices

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages