Skip to content
CAI
Software that uses CAICheck a score

ivanpaulovich/hexagonal-architecture-acerola

35.0

Weak · 20 September 2026

2.8k

lines of production code

C#

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

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.