Clean Architecture — это архитектурный подход, предложенный Робертом Мартином (Robert C. Martin), который направлен на создание легко поддерживаемых, расширяемых и независимых от инфраструктуры приложений. В C# этот подход широко применяется при разработке бизнес-приложений, особенно в сочетании с ASP.NET Core.
Основные принципы Clean Architecture
Clean Architecture основана на нескольких ключевых принципах:
- Независимость от фреймворков – приложение не должно зависеть от конкретных технологий.
- Тестируемость – бизнес-логика легко тестируется, так как изолирована от инфраструктуры.
- Независимость от UI – пользовательский интерфейс может быть заменен без изменения бизнес-логики.
- Независимость от базы данных – можно сменить базу данных без изменения бизнес-правил.
- Разделение ответственности – четкое разделение слоев по их назначению.
Основные слои Clean Architecture
Clean Architecture делит приложение на несколько слоев:
- Entities (Сущности) – основные бизнес-объекты и правила.
- Use Cases (Приложение) – содержит бизнес-логику и сценарии работы.
- Interface Adapters (Адаптеры интерфейсов) – преобразует данные между слоями.
- Infrastructure (Инфраструктура) – взаимодействие с внешними сервисами, базами данных и API.
Пример структуры проекта
Типичная структура проекта, реализованного по принципам Clean Architecture:
/Application
/Interfaces
/UseCases
/Core
/Entities
/Infrastructure
/Persistence
/Repositories
/WebAPI
/Controllers
Реализация основных слоев
Сущности (Entities)
Сущности представляют собой ядро системы и содержат бизнес-правила.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Use Cases (Приложение)
Сценарии использования управляют бизнес-логикой.
public class GetProductQuery : IRequest<Product>
{
public int Id { get; set; }
}
public class GetProductHandler : IRequestHandler<GetProductQuery, Product>
{
private readonly IProductRepository _repository;
public GetProductHandler(IProductRepository repository)
{
_repository = repository;
}
public async Task<Product> Handle(GetProductQuery request, CancellationToken cancellationToken)
{
return await _repository.GetByIdAsync(request.Id);
}
}
Реализация репозитория
public class ProductRepository : IProductRepository
{
private readonly ApplicationDbContext _context;
public ProductRepository(ApplicationDbContext context)
{
_context = context;
}
public async Task<Product> GetByIdAsync(int id)
{
return await _context.Products.FindAsync(id);
}
}
Контроллер Web API
[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
private readonly IMediator _mediator;
public ProductsController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet("{id}")]
public async Task<ActionResult<Product>> Get(int id)
{
return await _mediator.Send(new GetProductQuery { Id = id });
}
}
Clean Architecture позволяет строить гибкие, масштабируемые и тестируемые приложения в C#. Она разделяет код на независимые слои, упрощает поддержку и расширение системы.