# david-torosyan/onion-architecture architecture

> Architecture diagram of the GitHub repository david-torosyan/onion-architecture, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/david-torosyan/onion-architecture
- Repository: https://github.com/david-torosyan/onion-architecture

## Overview

MyApp is a .NET user-management REST API organized around onion architecture. The main workflow accepts user creation, credential validation, or active-user listing requests, applies application logic and domain specifications, and persists or reads users through repository and unit-of-work abstractions backed by EF Core. Separate infrastructure capabilities provide logging and email delivery. The README documents broader architectural patterns and technologies; the graph focuses on capabilities evidenced by the tree and sampled source, so uncertain wiring is omitted.

Main entry points: [`src/MyApp.Application/Services/UserService.cs`](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Application/Services/UserService.cs) (User service), [`src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs`](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs) (EF repository), [`src/MyApp.WebApi/Controllers/UserController.cs`](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.WebApi/Controllers/UserController.cs) (User endpoints), [`src/MyApp.Infrastructure/Repositories/UnitOfWork.cs`](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/UnitOfWork.cs) (Unit of work)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_presentation["API presentation"]
  node_api["Web API host<br/>[Program.cs]"]
  node_user_controller["User endpoints<br/>[UserController.cs]"]
end

subgraph group_application["Application services"]
  node_user_service["User service<br/>[UserService.cs]"]
  node_user_contract["User service contract<br/>[IUserService.cs]"]
  node_user_models["User requests and responses<br/>[Models]"]
  node_user_dto["User DTO<br/>[UserDTO.cs]"]
end

subgraph group_domain["User domain"]
  node_domain_user["User entity<br/>[User.cs]"]
  node_user_status["User status<br/>[UserStatus.cs]"]
  node_user_specs["User specifications"]
  node_domain_exceptions["User exceptions<br/>[Exceptions]"]
  node_repository_contract["Repository contract"]
  node_unit_contract["Unit of work contract<br/>[IUnitOfWork.cs]"]
  node_spec_contract["Specification contract<br/>[ISpecification.cs]"]
end

subgraph group_infrastructure["Infrastructure"]
  node_unit_work["Unit of work<br/>[UnitOfWork.cs]"]
  node_repository["EF repository"]
  node_spec_evaluator["Specification evaluator"]
  node_db_context["EF database context<br/>[MyAppDbContext.cs]"]
  node_logger["Logger service<br/>[LoggerService.cs]"]
  node_email["Email service<br/>[EmailService.cs]"]
end

node_client(("API client"))
node_database[("SQL Server database")]
node_smtp(("SMTP or pickup delivery"))

node_client -->|"sends requests"| node_user_controller
node_api -->|"maps controllers"| node_user_controller
node_user_controller -->|"calls"| node_user_contract
node_user_controller -->|"accepts and returns"| node_user_models
node_user_contract -->|"implemented by"| node_user_service
node_user_service -->|"calls"| node_unit_contract
node_user_service -->|"builds queries"| node_user_specs
node_user_service -->|"creates and reads"| node_domain_user
node_user_service -->|"checks status"| node_user_status
node_user_service -->|"throws"| node_domain_exceptions
node_user_service -->|"maps results"| node_user_dto
node_user_service -->|"logs events"| node_logger
node_unit_contract -->|"implemented by"| node_unit_work
node_unit_work -->|"provides repositories"| node_repository_contract
node_unit_work -->|"saves changes"| node_db_context
node_repository_contract -->|"implemented by"| node_repository
node_repository -->|"evaluates specifications"| node_spec_evaluator
node_repository -->|"accepts specifications"| node_spec_contract
node_repository -->|"queries and updates"| node_db_context
node_db_context -->|"persists users"| node_database
node_api -->|"runs migrations"| node_database
node_email -.->|"sends messages"| node_smtp

click node_api "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.WebApi/Program.cs"
click node_user_controller "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.WebApi/Controllers/UserController.cs"
click node_user_service "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Application/Services/UserService.cs"
click node_user_contract "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Application/Interfaces/IUserService.cs"
click node_user_models "https://github.com/david-torosyan/onion-architecture/tree/main/src/MyApp.Application/Models"
click node_user_dto "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Application/Models/DTOs/UserDTO.cs"
click node_domain_user "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Entities/User.cs"
click node_user_status "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Enums/UserStatus.cs"
click node_user_specs "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Specifications/UserSpecifications.cs"
click node_domain_exceptions "https://github.com/david-torosyan/onion-architecture/tree/main/src/MyApp.Domain/Exceptions"
click node_repository_contract "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Core/Repositories/IBaseRepositoryAsync.cs"
click node_unit_contract "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Core/Repositories/IUnitOfWork.cs"
click node_spec_contract "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Core/Specifications/ISpecification.cs"
click node_unit_work "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/UnitOfWork.cs"
click node_repository "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs"
click node_spec_evaluator "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/SpecificationEvaluator.cs"
click node_db_context "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Data/MyAppDbContext.cs"
click node_logger "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Services/LoggerService.cs"
click node_email "https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Services/EmailService.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_api,node_user_controller,node_client toneBlue
class node_user_service,node_user_contract,node_user_models,node_user_dto,node_database toneAmber
class node_domain_user,node_user_status,node_user_specs,node_domain_exceptions,node_repository_contract,node_unit_contract,node_spec_contract toneMint
class node_unit_work,node_repository,node_spec_evaluator,node_db_context,node_logger,node_email toneRose
class node_smtp toneIndigo
```

## Components

### API presentation

- [Web API host](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.WebApi/Program.cs): `src/MyApp.WebApi/Program.cs`
- [User endpoints](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.WebApi/Controllers/UserController.cs): `src/MyApp.WebApi/Controllers/UserController.cs`

### Application services

- [User service](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Application/Services/UserService.cs): `src/MyApp.Application/Services/UserService.cs`
- [User service contract](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Application/Interfaces/IUserService.cs): `src/MyApp.Application/Interfaces/IUserService.cs`
- [User requests and responses](https://github.com/david-torosyan/onion-architecture/tree/main/src/MyApp.Application/Models): `src/MyApp.Application/Models`
- [User DTO](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Application/Models/DTOs/UserDTO.cs): `src/MyApp.Application/Models/DTOs/UserDTO.cs`

### User domain

- [User entity](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Entities/User.cs): `src/MyApp.Domain/Entities/User.cs`
- [User status](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Enums/UserStatus.cs): `src/MyApp.Domain/Enums/UserStatus.cs`
- [User specifications](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Specifications/UserSpecifications.cs): `src/MyApp.Domain/Specifications/UserSpecifications.cs`
- [User exceptions](https://github.com/david-torosyan/onion-architecture/tree/main/src/MyApp.Domain/Exceptions): `src/MyApp.Domain/Exceptions`
- [Repository contract](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Core/Repositories/IBaseRepositoryAsync.cs): `src/MyApp.Domain/Core/Repositories/IBaseRepositoryAsync.cs`
- [Unit of work contract](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Core/Repositories/IUnitOfWork.cs): `src/MyApp.Domain/Core/Repositories/IUnitOfWork.cs`
- [Specification contract](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Domain/Core/Specifications/ISpecification.cs): `src/MyApp.Domain/Core/Specifications/ISpecification.cs`

### Infrastructure

- [Unit of work](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/UnitOfWork.cs): `src/MyApp.Infrastructure/Repositories/UnitOfWork.cs`
- [EF repository](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs): `src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs`
- [Specification evaluator](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/SpecificationEvaluator.cs): `src/MyApp.Infrastructure/Repositories/SpecificationEvaluator.cs`
- [EF database context](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Data/MyAppDbContext.cs): `src/MyApp.Infrastructure/Data/MyAppDbContext.cs`
- [Logger service](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Services/LoggerService.cs): `src/MyApp.Infrastructure/Services/LoggerService.cs`
- [Email service](https://github.com/david-torosyan/onion-architecture/blob/main/src/MyApp.Infrastructure/Services/EmailService.cs): `src/MyApp.Infrastructure/Services/EmailService.cs`

### Other components

- **API client**
- **SQL Server database**
- **SMTP or pickup delivery**

## Connections

- API client → User endpoints: sends requests
- Web API host → User endpoints: maps controllers
- User endpoints → User service contract: calls
- User endpoints → User requests and responses: accepts and returns
- User service contract → User service: implemented by
- User service → Unit of work contract: calls
- User service → User specifications: builds queries
- User service → User entity: creates and reads
- User service → User status: checks status
- User service → User exceptions: throws
- User service → User DTO: maps results
- User service → Logger service: logs events
- Unit of work contract → Unit of work: implemented by
- Unit of work → Repository contract: provides repositories
- Unit of work → EF database context: saves changes
- Repository contract → EF repository: implemented by
- EF repository → Specification evaluator: evaluates specifications
- EF repository → Specification contract: accepts specifications
- EF repository → EF database context: queries and updates
- EF database context → SQL Server database: persists users
- Web API host → SQL Server database: runs migrations
- Email service → SMTP or pickup delivery: sends messages
