# nilavpatel/dotnet-onion-architecture architecture

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

- Interactive diagram: https://gitdiagram.com/nilavpatel/dotnet-onion-architecture
- Repository: https://github.com/nilavpatel/dotnet-onion-architecture

## Overview

This is a .NET 8 user-management REST API organized around the documented onion architecture. The principal workflow enters through the user controller, delegates create, validate, or active-user listing to the application service, and uses domain specifications and repository contracts to access persisted users. The repository and unit of work are implemented with Entity Framework; infrastructure also provides email and logging services. The README documents the broader layer responsibilities, while source-index references and excerpts support the specific calls and wiring shown here; unsampled behavior is not inferred.

Main entry points: [`src/MyApp.Application/Services/UserService.cs`](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Services/UserService.cs) (User workflows), [`src/MyApp.Infrastructure/ServiceExtensions.cs`](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/ServiceExtensions.cs) (Infrastructure registration), [`src/MyApp.Infrastructure/Services/EmailService.cs`](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/Services/EmailService.cs) (Email service), [`src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs`](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs) (Async repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_presentation["Presentation"]
  node_user_controller["User controller<br/>[UserController.cs]"]
end

subgraph group_application["Application"]
  node_user_contract["User service contract<br/>[IUserService.cs]"]
  node_user_service["User workflows<br/>[UserService.cs]"]
  node_user_models["User API models<br/>[Models]"]
  node_user_dto["User DTO mapping<br/>[UserDTO.cs]"]
  node_service_extensions["Application registration"]
  node_email_contract["Email contract<br/>[IEmailService.cs]"]
  node_email_model["Email model<br/>[Email.cs]"]
  node_logger_contract["Logger contract<br/>[ILoggerService.cs]"]
end

subgraph group_domain["Domain"]
  node_user_entity["User entity<br/>[User.cs]"]
  node_user_status["User status<br/>[UserStatus.cs]"]
  node_user_specs["User specifications"]
  node_repository_contracts["Repository contracts<br/>[Repositories]"]
  node_specification_contract["Specification contract<br/>[ISpecification.cs]"]
  node_base_entity["Base entity<br/>[BaseEntity.cs]"]
end

subgraph group_infrastructure["Infrastructure"]
  node_repository["Async repository"]
  node_spec_evaluator["Specification evaluator"]
  node_unit_of_work["Unit of work<br/>[UnitOfWork.cs]"]
  node_db_context["EF database context<br/>[MyAppDbContext.cs]"]
  node_database[("SQL Server database")]
  node_infra_registration["Infrastructure registration"]
  node_email_service["Email service<br/>[EmailService.cs]"]
  node_logger_service["Logger service<br/>[LoggerService.cs]"]
end

node_client(("API client"))
node_smtp["SMTP service"]

node_client -->|"sends requests"| node_user_controller
node_user_controller -->|"dispatches to"| node_user_contract
node_user_service -->|"implements"| node_user_contract
node_user_service -->|"uses requests and responses"| node_user_models
node_user_service -->|"maps users to"| node_user_dto
node_user_service -->|"uses unit of work"| node_repository_contracts
node_user_service -->|"builds queries with"| node_user_specs
node_user_service -->|"logs through"| node_logger_contract
node_user_specs -->|"specifies queries for"| node_user_entity
node_user_entity -->|"uses status"| node_user_status
node_user_entity -->|"inherits"| node_base_entity
node_repository_contracts -->|"constrains entities by"| node_base_entity
node_repository_contracts -->|"accepts specifications"| node_specification_contract
node_repository -->|"implements"| node_repository_contracts
node_repository -->|"queries and updates"| node_db_context
node_repository -->|"evaluates specifications with"| node_spec_evaluator
node_spec_evaluator -->|"evaluates"| node_specification_contract
node_unit_of_work -->|"creates repositories"| node_repository
node_unit_of_work -->|"saves through"| node_db_context
node_db_context -->|"maps users"| node_user_entity
node_db_context -.->|"persists data to"| node_database
node_infra_registration -->|"configures"| node_db_context
node_infra_registration -->|"registers"| node_repository
node_infra_registration -->|"registers"| node_unit_of_work
node_infra_registration -->|"registers"| node_email_service
node_infra_registration -->|"registers"| node_logger_service
node_email_service -->|"implements"| node_email_contract
node_email_service -->|"sends"| node_email_model
node_email_service -->|"sends mail through"| node_smtp
node_email_service -->|"logs failures through"| node_logger_contract
node_logger_service -->|"implements"| node_logger_contract

click node_user_controller "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.WebApi/Controllers/UserController.cs"
click node_user_contract "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Interfaces/IUserService.cs"
click node_user_service "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Services/UserService.cs"
click node_user_models "https://github.com/nilavpatel/dotnet-onion-architecture/tree/main/src/MyApp.Application/Models"
click node_user_dto "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Models/DTOs/UserDTO.cs"
click node_service_extensions "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/ServiceExtensions.cs"
click node_user_entity "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Entities/User.cs"
click node_user_status "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Enums/UserStatus.cs"
click node_user_specs "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Specifications/UserSpecifications.cs"
click node_repository_contracts "https://github.com/nilavpatel/dotnet-onion-architecture/tree/main/src/MyApp.Domain/Core/Repositories"
click node_specification_contract "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Core/Specifications/ISpecification.cs"
click node_base_entity "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Core/Models/BaseEntity.cs"
click node_repository "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs"
click node_spec_evaluator "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/SpecificationEvaluator.cs"
click node_unit_of_work "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/Repositories/UnitOfWork.cs"
click node_db_context "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/Data/MyAppDbContext.cs"
click node_infra_registration "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/ServiceExtensions.cs"
click node_email_service "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/Services/EmailService.cs"
click node_email_contract "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Core/Services/IEmailService.cs"
click node_email_model "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Core/Models/Email.cs"
click node_logger_contract "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Core/Services/ILoggerService.cs"
click node_logger_service "https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Infrastructure/Services/LoggerService.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_user_controller,node_client toneBlue
class node_user_contract,node_user_service,node_user_models,node_user_dto,node_service_extensions,node_email_contract,node_email_model,node_logger_contract toneAmber
class node_user_entity,node_user_status,node_user_specs,node_repository_contracts,node_specification_contract,node_base_entity toneMint
class node_repository,node_spec_evaluator,node_unit_of_work,node_db_context,node_database,node_infra_registration,node_email_service,node_logger_service toneRose
class node_smtp toneIndigo
```

## Components

### Presentation

- [User controller](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.WebApi/Controllers/UserController.cs): `src/MyApp.WebApi/Controllers/UserController.cs`

### Application

- [User service contract](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Interfaces/IUserService.cs): `src/MyApp.Application/Interfaces/IUserService.cs`
- [User workflows](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Services/UserService.cs): `src/MyApp.Application/Services/UserService.cs`
- [User API models](https://github.com/nilavpatel/dotnet-onion-architecture/tree/main/src/MyApp.Application/Models): `src/MyApp.Application/Models`
- [User DTO mapping](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Models/DTOs/UserDTO.cs): `src/MyApp.Application/Models/DTOs/UserDTO.cs`
- [Application registration](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/ServiceExtensions.cs): `src/MyApp.Application/ServiceExtensions.cs`
- [Email contract](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Core/Services/IEmailService.cs): `src/MyApp.Application/Core/Services/IEmailService.cs`
- [Email model](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Core/Models/Email.cs): `src/MyApp.Application/Core/Models/Email.cs`
- [Logger contract](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Application/Core/Services/ILoggerService.cs): `src/MyApp.Application/Core/Services/ILoggerService.cs`

### Domain

- [User entity](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Entities/User.cs): `src/MyApp.Domain/Entities/User.cs`
- [User status](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Enums/UserStatus.cs): `src/MyApp.Domain/Enums/UserStatus.cs`
- [User specifications](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Specifications/UserSpecifications.cs): `src/MyApp.Domain/Specifications/UserSpecifications.cs`
- [Repository contracts](https://github.com/nilavpatel/dotnet-onion-architecture/tree/main/src/MyApp.Domain/Core/Repositories): `src/MyApp.Domain/Core/Repositories`
- [Specification contract](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Core/Specifications/ISpecification.cs): `src/MyApp.Domain/Core/Specifications/ISpecification.cs`
- [Base entity](https://github.com/nilavpatel/dotnet-onion-architecture/blob/main/src/MyApp.Domain/Core/Models/BaseEntity.cs): `src/MyApp.Domain/Core/Models/BaseEntity.cs`

### Infrastructure

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

### Other components

- **API client**
- **SMTP service**

## Connections

- API client → User controller: sends requests (evidence: `src/MyApp.WebApi/Controllers/UserController.cs`)
- User controller → User service contract: dispatches to (evidence: `src/MyApp.WebApi/Controllers/UserController.cs`)
- User workflows → User service contract: implements (evidence: `src/MyApp.Application/Services/UserService.cs`)
- User workflows → User API models: uses requests and responses (evidence: `src/MyApp.Application/Services/UserService.cs`)
- User workflows → User DTO mapping: maps users to (evidence: `src/MyApp.Application/Services/UserService.cs`)
- User workflows → Repository contracts: uses unit of work (evidence: `src/MyApp.Application/Services/UserService.cs`)
- User workflows → User specifications: builds queries with (evidence: `src/MyApp.Application/Services/UserService.cs`)
- User workflows → Logger contract: logs through (evidence: `src/MyApp.Application/Services/UserService.cs`)
- User specifications → User entity: specifies queries for (evidence: `src/MyApp.Domain/Specifications/UserSpecifications.cs`)
- User entity → User status: uses status (evidence: `src/MyApp.Domain/Entities/User.cs`)
- User entity → Base entity: inherits (evidence: `src/MyApp.Domain/Entities/User.cs`)
- Repository contracts → Base entity: constrains entities by (evidence: `src/MyApp.Domain/Core/Repositories/IBaseRepositoryAsync.cs`)
- Repository contracts → Specification contract: accepts specifications (evidence: `src/MyApp.Domain/Core/Repositories/IBaseRepositoryAsync.cs`)
- Async repository → Repository contracts: implements (evidence: `src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs`)
- Async repository → EF database context: queries and updates (evidence: `src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs`)
- Async repository → Specification evaluator: evaluates specifications with (evidence: `src/MyApp.Infrastructure/Repositories/BaseRepositoryAsync.cs`)
- Specification evaluator → Specification contract: evaluates (evidence: `src/MyApp.Infrastructure/Repositories/SpecificationEvaluator.cs`)
- Unit of work → Async repository: creates repositories (evidence: `src/MyApp.Infrastructure/Repositories/UnitOfWork.cs`)
- Unit of work → EF database context: saves through (evidence: `src/MyApp.Infrastructure/Repositories/UnitOfWork.cs`)
- EF database context → User entity: maps users (evidence: `src/MyApp.Infrastructure/Data/MyAppDbContext.cs`)
- EF database context → SQL Server database: persists data to
- Infrastructure registration → EF database context: configures (evidence: `src/MyApp.Infrastructure/ServiceExtensions.cs`)
- Infrastructure registration → Async repository: registers (evidence: `src/MyApp.Infrastructure/ServiceExtensions.cs`)
- Infrastructure registration → Unit of work: registers (evidence: `src/MyApp.Infrastructure/ServiceExtensions.cs`)
- Infrastructure registration → Email service: registers (evidence: `src/MyApp.Infrastructure/ServiceExtensions.cs`)
- Infrastructure registration → Logger service: registers (evidence: `src/MyApp.Infrastructure/ServiceExtensions.cs`)
- Email service → Email contract: implements (evidence: `src/MyApp.Infrastructure/Services/EmailService.cs`)
- Email service → Email model: sends (evidence: `src/MyApp.Infrastructure/Services/EmailService.cs`)
- Email service → SMTP service: sends mail through (evidence: `src/MyApp.Infrastructure/Services/EmailService.cs`)
- Email service → Logger contract: logs failures through (evidence: `src/MyApp.Infrastructure/Services/EmailService.cs`)
- Logger service → Logger contract: implements (evidence: `src/MyApp.Infrastructure/Services/LoggerService.cs`)
