alesimoes/hexagonal-clean-architecture
38.4
Weak · 21 September 2026
2.3k
lines of production code
C#
primary language
4
measurements over time
What this system is
This system is a domain-driven .NET API for managing stock trading and user wallets. It exposes endpoints for buying and selling stocks, retrieving transaction histories, and checking wallet balances. The architecture relies on a layered design with use cases, domain models, and event handlers to handle business logic and data persistence.
Features
Added use cases for retrieving wallet and transaction data
Introduced new application-layer use cases for fetching wallet details and transaction histories. The GetWallet use case retrieves a user's wallet information, including invested amounts and associated stock holdings, while the GetTransactions use case fetches transaction records within a specified date range, enforcing a 90-day limit. Both use cases include input validation to ensure valid identifiers and date ranges, and map domain entities to output models for consumption.
source/ANM.Example.Application/UseCases/GetTransactions, source/ANM.Example.Application/UseCases/GetWallet · high confidence
Initial release of the ANM Example API with domain-driven architecture
The application now includes a complete domain-driven design implementation, introducing core abstractions for use cases, unit of work, and event publishing. The API layer exposes endpoints for creating users, buying/selling stocks, and retrieving wallet/transaction data, all wired through a FluentMediator pipeline. This change adds the foundational infrastructure, including dependency injection registrations, Swagger documentation, and repository interfaces, enabling the core business logic to be executed through a clean, layered architecture.
(repo-wide) · high confidence
Introduce domain models and event handlers for stock trading and user wallet management
Added domain entities for Stock, Transaction, and Wallet, along with their corresponding domain events (StockBougthDomainEvent, StockSoldDomainEvent, TransactionCreatedDomainEvent, WalletUpdatedDomainEvent) and their respective handlers. This introduces the core logic for buying and selling stocks, recording transactions, and updating wallet balances, including validation for stock quantities and amounts.
source/ANM.Example.Domain · high confidence
Dependencies
Add .NET Core 3.1 and .NET Standard 2.0 project files for the example application
The example application's build structure is established by adding nine new .csproj files, defining the project graph and dependencies. The API and repositories projects target .NET Core 3.1, while the core abstractions and other supporting projects target .NET Standard 2.0. This includes specific package references such as Microsoft.EntityFrameworkCore 3.1.1, Swashbuckle.AspNetCore 5.0.0, and FluentMediator 0.4.7, effectively setting up the dependency graph for the example solution.
(dependencies) · medium 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 39 → 38 (-0.5)
- Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 65 → 65 (-0.1)
- Architecture 85 → 85 (+0.0)
- Maturity 73 → 73 (+0.0)
- Readiness 20 → 17 (-2.7)
- Security 48 → 49 (+0.2)
- Domain Modelling 53 → 58 (+4.8)
Resolved (26)
- Bounded contexts not declared
- Inconsistency in interface naming: the service interface is named IWalletService, but the implementation is WalletService. While this is a common pattern, the lack of 'Service' suffix on the interface (compared to the implementation) is a minor inconsistency in the codebase's own naming conventions for abstractions.
- Inconsistent naming for output models in the GetTransactions use case. One is named TransactionOutput (likely a mistake or legacy name) while the other is GetTransactionsOutput. This suggests a confusion between the output of the use case and the output of a specific transaction within it.
- Medium CVE: Microsoft.Data.SqlClient 1.0.19269.1
- Medium CVE: SharpCompress 0.23.0
- Medium CVE: SharpCompress 0.23.0
- No ADRs found
- No exposed public API
- The README is a single file with no dedicated architecture or domain documentation (no .csproj/Domain/Repositories/API XML docs), so it cannot be trusted for implementation details such as how to implement Use Cases/Input Port/Output Port/Repository/Application Exceptions/DOMAIN Layer (DDD)/Value Objects/Entities/Events (Event Sourcing)/Domain Service/Domain Exceptions. (README.md)
- Typo in domain event name: 'Bougth' instead of 'Bought'. This typo is also present in the corresponding handler class name.
- XML-doc coverage: ANM.Core.Application.Abstractions (source/ANM.Core.Application.Abstraction/ANM.Core.Application.Abstractions.csproj)
- XML-doc coverage: ANM.Core.Domain.Abstractions (source/ANM.Core.Domain.Abstractions/ANM.Core.Domain.Abstractions.csproj)
- XML-doc coverage: ANM.Example.API (source/ANM.Example.API/ANM.Example.API.csproj)
- XML-doc coverage: ANM.Example.Application (source/ANM.Example.Application/ANM.Example.Application.csproj)
- XML-doc coverage: ANM.Example.Application.Abstractions (source/ANM.Example.Application.Abstractions/ANM.Example.Application.Abstractions.csproj)
- XML-doc coverage: ANM.Example.Domain (source/ANM.Example.Domain/ANM.Example.Domain.csproj)
- XML-doc coverage: ANM.Example.EventPublisher (source/ANM.Example.EventPublisher/ANM.Example.EventPublisher.csproj)
- XML-doc coverage: ANM.Example.Infrastructure.EventHandler (source/ANM.Example.Infrastructure.EventHandler/ANM.Example.Infrastructure.EventHandler.csproj)
- XML-doc coverage: ANM.Example.Repositories (source/ANM.Example.Repositories/ANM.Example.Repositories.csproj)
- early-stage repository — too few commits for a meaningful bus factor
- …and 6 more
New (19)
- Duplicated block (30 lines × 2) (source/ANM.Example.Application/UseCases/BuyStock/BuyStockInput.cs)
- Duplicated block (6 lines × 2) (source/ANM.Example.Application/UseCases/BuyStock/BuyStockOutput.cs)
- Duplicated block (8 lines × 2) (source/ANM.Example.Application/UseCases/GetTransactions/TransactionOutput.cs)
- End-of-life runtime: .NET netcoreapp3.1
- High IaC: WD-COMPOSE-0002 (source/ANM.Example.Repositories/docker-compose.yml)
- High IaC: WD-COMPOSE-0002 (source/ANM.Example.Repositories/docker-compose.yml)
- Low XML-doc coverage: ANM.Core.Application.Abstractions (source/ANM.Core.Application.Abstraction/ANM.Core.Application.Abstractions.csproj)
- Low XML-doc coverage: ANM.Core.Domain.Abstractions (source/ANM.Core.Domain.Abstractions/ANM.Core.Domain.Abstractions.csproj)
- Low XML-doc coverage: ANM.Example.API (source/ANM.Example.API/ANM.Example.API.csproj)
- Low XML-doc coverage: ANM.Example.Application (source/ANM.Example.Application/ANM.Example.Application.csproj)
- Low XML-doc coverage: ANM.Example.Application.Abstractions (source/ANM.Example.Application.Abstractions/ANM.Example.Application.Abstractions.csproj)
- Low XML-doc coverage: ANM.Example.Domain (source/ANM.Example.Domain/ANM.Example.Domain.csproj)
- Low XML-doc coverage: ANM.Example.EventPublisher (source/ANM.Example.EventPublisher/ANM.Example.EventPublisher.csproj)
- Low XML-doc coverage: ANM.Example.Infrastructure.EventHandler (source/ANM.Example.Infrastructure.EventHandler/ANM.Example.Infrastructure.EventHandler.csproj)
- Low XML-doc coverage: ANM.Example.Repositories (source/ANM.Example.Repositories/ANM.Example.Repositories.csproj)
- Medium CVE: SharpCompress 0.23.0
- Parameter name 'transactionsReporitory' in the constructor/dependency of ITransactionRepository (or its implementation) contains a typo: 'Reporitory' instead of 'Repository'.
- Typo in class name: 'EventPubisher' instead of 'EventPublisher'.
- Typo in domain event name: 'StockBougth' instead of 'StockBought'. This typo is propagated to the corresponding handler class name.
API surface
- Unchanged — 5 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
alesimoes/hexagonal-clean-architecture 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 21 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 7986ee5281f1d376ca11bf02f3881dc3870b357b — 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.