ivanpaulovich/hexagonal-architecture-acerola
35.0
Weak · 20 September 2026
2.8k
lines of production code
C#
primary language
4
measurements over time
What this system is
Acerola is a .NET Core 2.0 service template that implements Hexagonal Architecture and Domain-Driven Design to facilitate the development of evolvable applications. It provides a concrete banking domain example featuring customer registration, account management, and transaction processing, supported by a multi-layered structure for domain, application, and infrastructure concerns. The system includes comprehensive tooling for local development, such as Docker-based setups for backend services, Kafka, and MongoDB, along with a robust test suite covering domain logic and API integration.
Features
Added Docker-based setup scripts for backend, Kafka, and MongoDB
New shell scripts and a Docker Compose file have been added to the setup directory to streamline local environment configuration. The \acerola.sh\ script manages the Acerola backend container, pulling the latest image, stopping and removing existing instances, and running the service on port 8000 with a MongoDB connection string. The \mongodb.sh\ script handles the MongoDB container lifecycle, exposing port 27017. Additionally, \docker-compose.yml\ defines a Kafka service using the \spotify/kafka\ image, exposing ports 2181 and 9092 with specific advertised host and port settings.
setup · high confidence
Initial implementation of banking domain logic and data access
This change introduces the core application and domain layers for a banking system, enabling users to register customers, deposit and withdraw funds, close accounts, and query account or customer details. It defines the domain model (Account, Customer, Credit, Debit, Value Objects) with business rules, implements use cases for these operations, and provides a SQL-based infrastructure layer using Dapper to persist and retrieve data.
(repo-wide) · high confidence
Initial release of Acerola hexagonal architecture template
This change introduces the initial codebase for Acerola, a .NET Core 2.0 service template designed to help developers build evolvable applications using Hexagonal Architecture and Domain-Driven Design. The repository includes the solution structure with projects for Domain, Application, Infrastructure, and WebApi, along with a comprehensive README explaining the architecture, prerequisites, and how to run the application via Docker or source.
(repo-wide) · high confidence
Test coverage
Initial test suite for domain, use cases, and Web API
Added comprehensive unit and integration tests for the Acerola application. The \Acerola.Domain.Tests\ project covers value objects (Amount, Name, SSN), entities (Account, Customer), and transaction types (Credit, Debit), verifying behaviors such as balance calculations, validation constraints, and persistence loading. The \Acerola.UseCases.Tests\ project validates the Register and Deposit use cases against mocked repositories. The \Acerola.WebApi.Tests\ project includes an integration test for the customer registration flow and configuration files for Autofac modules supporting In-Memory, Dapper, Entity Framework, and MongoDB data access strategies.
test · high confidence
Dependencies
Initial project structure and dependency configuration
The application is initialized with a multi-project architecture comprising Domain, Application, Infrastructure, and WebApi layers, alongside corresponding test projects. The solution targets .NET Standard 2.0 for shared libraries and .NET Core 2.0 for the API and tests. Key dependencies include Autofac for dependency injection, MongoDB Driver and Dapper for data access, Entity Framework Core for SQL Server, and Serilog for logging. The WebApi project is configured with Swashbuckle for API documentation and AutoMapper for object mapping, while test projects utilize xUnit, NSubstitute, and Microsoft.AspNetCore.TestHost.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 38 → 35 (-2.7)
- Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 73 → 74 (+0.1)
- Architecture 74 → 74 (+0.0)
- Maturity 55 → 55 (+0.0)
- Readiness 28 → 27 (-0.8)
- Security 29 → 23 (-6.0)
Resolved (31)
- Bounded contexts not declared
- Dead code: CustomerNotFoundException (src/Acerola.Application/CustomerNotFoundException.cs)
- Documentation Quality not included (check did not complete)
- Duplicated block (14 lines × 2) (src/Acerola.Infrastructure/InMemoryDataAccess/Queries/AccountsQueries.cs)
- Duplicated block (18 lines × 2) (src/Acerola.Infrastructure/EntityFrameworkDataAccess/Repositories/AccountRepository.cs)
- High CVE: Microsoft.AspNetCore.Identity 2.0.0
- High CVE: Microsoft.AspNetCore.Identity 2.0.0
- High CVE: Microsoft.AspNetCore.Server.Kestrel.Core 2.0.0
- High CVE: Microsoft.AspNetCore.Server.Kestrel.Core 2.0.0
- High CVE: System.Net.Security 4.0.0
- High CVE: System.Net.Security 4.0.0
- High CVE: System.Net.Security 4.3.0
- High CVE: System.Net.Security 4.3.0
- High CVE: System.Security.Cryptography.Xml 4.4.0
- High CVE: System.Security.Cryptography.Xml 4.4.0
- Medium CVE: Microsoft.AspNetCore.All 2.0.0
- Medium CVE: Microsoft.AspNetCore.All 2.0.0
- Medium CVE: Microsoft.AspNetCore.Server.Kestrel.Core 2.0.0
- Medium CVE: Microsoft.AspNetCore.Server.Kestrel.Core 2.0.0
- Medium CVE: Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv 2.0.0
- …and 11 more
New (23)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (16 lines × 2) (src/Acerola.Infrastructure/DapperDataAccess/Queries/AccountsQueries.cs)
- Duplicated block (18 lines × 2) (src/Acerola.WebApi/UseCases/Deposit/AccountsController.cs)
- Duplicated block (21 lines × 2) (src/Acerola.Infrastructure/DapperDataAccess/Queries/AccountsQueries.cs)
- Duplicated block (29 lines × 2) (src/Acerola.Infrastructure/InMemoryDataAccess/Queries/AccountsQueries.cs)
- Duplicated block (36 lines × 3) (src/Acerola.Infrastructure/EntityFrameworkDataAccess/Queries/AccountsQueries.cs)
- Duplicated block (39 lines × 2) (src/Acerola.Infrastructure/EntityFrameworkDataAccess/Repositories/AccountRepository.cs)
- Edited copy of a member (29 corresponding lines) (src/Acerola.Infrastructure/InMemoryDataAccess/Queries/AccountsQueries.cs)
- Edited copy of a member (48 corresponding lines) (src/Acerola.Infrastructure/EntityFrameworkDataAccess/Queries/AccountsQueries.cs)
- End-of-life runtime: .NET netcoreapp2.0
- High CVE: Microsoft.AspNetCore.Identity 2.0.0
- High CVE: System.Net.Security 4.0.0
- High CVE: System.Net.Security 4.3.0
- High CVE: System.Security.Cryptography.Xml 4.4.0
- High IaC: WD-COMPOSE-0002 (setup/docker-compose.yml)
- Spelling inconsistency for the same concept (Swedish Social Security Number). One parameter is named 'personnummer' and another 'perssonnummer' (double 's').
- XML-doc coverage: Acerola.Application (src/Acerola.Application/Acerola.Application.csproj)
- XML-doc coverage: Acerola.Domain (src/Acerola.Domain/Acerola.Domain.csproj)
- XML-doc coverage: Acerola.Infrastructure (src/Acerola.Infrastructure/Acerola.Infrastructure.csproj)
- …and 3 more
API surface
- Unchanged — 6 HTTP endpoints
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
ivanpaulovich/hexagonal-architecture-acerola was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 20 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 1569ba2f716cb04117c4da551dc9f2904b082244 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.