Bumps Aikido.Zen.DotNetCore from 1.2.8 to 1.2.10 Bumps Aspire.Hosting.AppHost from 9.2.1 to 9.3.0 Bumps Aspire.Hosting.RabbitMQ from 9.2.1 to 9.3.0 Bumps Aspire.Hosting.Redis from 9.2.1 to 9.3.0 Bumps FluentValidation from 11.11.0 to 12.0.0 Bumps Google.Protobuf from 3.30.2 to 3.31.1 Bumps Google.Protobuf.Tools from 3.30.2 to 3.31.1 Bumps MassTransit from 8.4.0 to 8.4.1 Bumps MassTransit.Newtonsoft from 8.4.0 to 8.4.1 Bumps MassTransit.RabbitMQ from 8.4.0 to 8.4.1 Bumps Microsoft.AspNetCore.Authentication.JwtBearer from 9.0.4 to 9.0.5 Bumps Microsoft.AspNetCore.Mvc.Testing from 9.0.4 to 9.0.5 Bumps Microsoft.AspNetCore.OpenApi from 9.0.4 to 9.0.5 Bumps Microsoft.EntityFrameworkCore from 9.0.4 to 9.0.5 Bumps Microsoft.EntityFrameworkCore.Design to 9.0.5, 9.0.5 Bumps Microsoft.EntityFrameworkCore.Proxies from 9.0.4 to 9.0.5 Bumps Microsoft.EntityFrameworkCore.Relational from 9.0.4 to 9.0.5 Bumps Microsoft.EntityFrameworkCore.SqlServer from 9.0.4 to 9.0.5 Bumps Microsoft.EntityFrameworkCore.Tools from 9.0.4 to 9.0.5 Bumps Microsoft.Extensions.Caching.StackExchangeRedis from 9.0.2 to 9.0.5 Bumps Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore from 9.0.4 to 9.0.5 Bumps Microsoft.Extensions.Http.Resilience from 9.4.0 to 9.5.0 Bumps Microsoft.Extensions.Options to 9.0.5, 9.0.5 Bumps Microsoft.Extensions.ServiceDiscovery from 9.2.1 to 9.3.0 Bumps Microsoft.NET.Test.Sdk from 17.13.0 to 17.14.0 Bumps NUnit.Analyzers from 4.7.0 to 4.8.1 Bumps OpenTelemetry.Instrumentation.AspNetCore from 1.11.1 to 1.12.0 Bumps OpenTelemetry.Instrumentation.Http from 1.11.1 to 1.12.0 Bumps OpenTelemetry.Instrumentation.Runtime from 1.11.1 to 1.12.0 Bumps Swashbuckle.AspNetCore from 8.1.1 to 8.1.2 Bumps Swashbuckle.AspNetCore.Annotations from 8.1.1 to 8.1.2 Bumps System.IdentityModel.Tokens.Jwt from 8.9.0 to 8.11.0 Bumps xunit.runner.visualstudio from 3.0.2 to 3.1.0 --- updated-dependencies: - dependency-name: Aikido.Zen.DotNetCore dependency-version: 1.2.10 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Aspire.Hosting.AppHost dependency-version: 9.3.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Aspire.Hosting.RabbitMQ dependency-version: 9.3.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Aspire.Hosting.Redis dependency-version: 9.3.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Aspire.Hosting.SqlServer dependency-version: 9.3.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: FluentValidation dependency-version: 12.0.0 dependency-type: direct:production update-type: version-update:semver-major - dependency-name: Google.Protobuf dependency-version: 3.31.1 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Google.Protobuf.Tools dependency-version: 3.31.1 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: MassTransit dependency-version: 8.4.1 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: MassTransit dependency-version: 8.4.1 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: MassTransit.Newtonsoft dependency-version: 8.4.1 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: MassTransit.RabbitMQ dependency-version: 8.4.1 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.AspNetCore.OpenApi dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.EntityFrameworkCore dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.EntityFrameworkCore dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.EntityFrameworkCore.Design dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.EntityFrameworkCore.Proxies dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.EntityFrameworkCore.Proxies dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.EntityFrameworkCore.Relational dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.EntityFrameworkCore.SqlServer dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.EntityFrameworkCore.Tools dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.Extensions.Caching.StackExchangeRedis dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.Extensions.Http.Resilience dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Microsoft.Extensions.Options dependency-version: 9.0.5 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.Extensions.ServiceDiscovery dependency-version: 9.3.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 17.14.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 17.14.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 17.14.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 17.14.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 17.14.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: NUnit.Analyzers dependency-version: 4.8.1 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: OpenTelemetry.Instrumentation.AspNetCore dependency-version: 1.12.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: OpenTelemetry.Instrumentation.Http dependency-version: 1.12.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: OpenTelemetry.Instrumentation.Runtime dependency-version: 1.12.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Swashbuckle.AspNetCore dependency-version: 8.1.2 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Swashbuckle.AspNetCore.Annotations dependency-version: 8.1.2 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: System.IdentityModel.Tokens.Jwt dependency-version: 8.11.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: xunit.runner.visualstudio dependency-version: 3.1.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: xunit.runner.visualstudio dependency-version: 3.1.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: xunit.runner.visualstudio dependency-version: 3.1.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: xunit.runner.visualstudio dependency-version: 3.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> |
||
---|---|---|
.github | ||
CleanArchitecture.Api | ||
CleanArchitecture.AppHost | ||
CleanArchitecture.Application | ||
CleanArchitecture.Application.Tests | ||
CleanArchitecture.Domain | ||
CleanArchitecture.Domain.Tests | ||
CleanArchitecture.gRPC | ||
CleanArchitecture.gRPC.Tests | ||
CleanArchitecture.Infrastructure | ||
CleanArchitecture.Infrastructure.Tests | ||
CleanArchitecture.IntegrationTests | ||
CleanArchitecture.Proto | ||
CleanArchitecture.ServiceDefaults | ||
CleanArchitecture.Shared | ||
k8s-deployments | ||
.dockerignore | ||
.gitignore | ||
CHANGELOG.md | ||
CleanArchitecture.sln | ||
docker-compose.yml | ||
Dockerfile | ||
LICENSE | ||
Readme.md |
Clean Architecture Dotnet 9 API Project
This repository contains a sample API project built using the Clean Architecture principles, Onion Architecture, MediatR, and Entity Framework. The project also includes unit tests for all layers and integration tests using xUnit and Nsubstitute.
The purpose of this project is to create a clean boilerplate for an API and to show how to implement specific features.
Project Structure
The project follows the Onion Architecture, which means that the codebase is organized into layers, with the domain model at the center and the outer layers dependent on the inner layers.
The project has the following structure:
- Domain: Contains the domain model, which represents the core business logic of the application. It includes entities, value objects, domain services, and domain events.
- Application: Contains the application layer, which implements the use cases of the system. It includes commands, queries, handlers, and DTOs.
- Infrastructure: Contains the infrastructure layer, which implements the technical details of the system. It includes database access, logging, configuration, and external services.
- API: Contains the presentation layer, which exposes the functionality of the system to the outside world. It includes controllers, action results, and view models.
Dependencies
The project uses the following dependencies:
- MediatR: A lightweight library that provides a mediator pattern implementation for .NET.
- Entity Framework Core: A modern object-relational mapper for .NET that provides data access to the application.
- FluentValidation: A validation library that provides a fluent API for validating objects.
- gRPC: gRPC is an open-source remote procedure call framework that enables efficient communication between distributed systems using a variety of programming languages and protocols.
Running the Project
To run the project, follow these steps:
- Clone the repository to your local machine.
- Open the solution in your IDE of choice.
- Build the solution to restore the dependencies.
- Update the connection string in the appsettings.json file to point to your database.
- Start the API project (Alterntively you can use the
dotnet run --project CleanArchitecture.Api
command) - The database migrations will be automatically applied on start-up. If the database does not exist, it will be created.
- The API should be accessible at
https://localhost:<port>/api/<controller>
where<port>
is the port number specified in the project properties and<controller>
is the name of the API controller.
Using Aspire
- Run
dotnet run --project CleanArchitecture.AppHost
in the root directory of the project.
Using docker
Requirements
This is only needed if running the API locally or only the docker image
- SqlServer:
docker run --name sqlserver -d -p 1433:1433 -e ACCEPT_EULA=Y -e SA_PASSWORD='Password123!#' mcr.microsoft.com/mssql/server
- RabbitMq:
docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 rabbitmq:4-management
- Redis:
docker run --name redis -d -p 6379:6379 -e ALLOW_EMPTY_PASSWORD=yes redis:latest
- Add this to the redis configuration in the Program.cs
options.ConfigurationOptions = new ConfigurationOptions
{
AbortOnConnectFail = false,
EndPoints = { "localhost", "6379" }
};
Running the container
- Build the Dockerfile:
docker build -t clean-architecture .
- Run the Container:
docker run --name clean-architecture -d -p 80:80 -p 8080:8080 clean-architecture
Using docker-compose
- Build the Dockerfile:
docker build -t clean-architecture .
- Running the docker compose:
docker-compose up -d
(Delete:docker-compose down
)
Using Kubernetes
- Build the docker image and push it to the docker hub (Change the image name in the
k8s-deployment.yml
to your own) - Apply the deployment file:
kubectl apply -f k8s-deployment.yml
(Delete:kubectl delete -f k8s-deployment.yml
)
Running the Tests
To run the tests, follow these steps:
- Open the solution in your IDE of choice.
- Build the solution to restore the dependencies.
- Open the Test Explorer window
- Run all the tests by clicking the Run All button in the Test Explorer.
Continuous Integration
This project uses GitHub Actions to build and test the project on every commit to the main branch. The workflow consists of several steps, including restoring packages, building the project and running tests.
Conclusion
This project is a sample implementation of the Clean Architecture principles, Onion Architecture, MediatR, and Entity Framework. It demonstrates how to organize a .NET 9 API project into layers, how to use the MediatR library to implement the mediator pattern, and how to use Entity Framework to access data. It also includes unit tests for all layers and integration tests using xUnit.