Что такое Clean Architecture в C#

Clean Architecture — это архитектурный подход, предложенный Робертом Мартином (Robert C. Martin), который направлен на создание легко поддерживаемых, расширяемых и независимых от инфраструктуры приложений. В C# этот подход широко применяется при разработке бизнес-приложений, особенно в сочетании с ASP.NET Core.

Основные принципы Clean Architecture

Clean Architecture основана на нескольких ключевых принципах:

  • Независимость от фреймворков – приложение не должно зависеть от конкретных технологий.
  • Тестируемость – бизнес-логика легко тестируется, так как изолирована от инфраструктуры.
  • Независимость от UI – пользовательский интерфейс может быть заменен без изменения бизнес-логики.
  • Независимость от базы данных – можно сменить базу данных без изменения бизнес-правил.
  • Разделение ответственности – четкое разделение слоев по их назначению.

Основные слои Clean Architecture

Clean Architecture делит приложение на несколько слоев:

  1. Entities (Сущности) – основные бизнес-объекты и правила.
  2. Use Cases (Приложение) – содержит бизнес-логику и сценарии работы.
  3. Interface Adapters (Адаптеры интерфейсов) – преобразует данные между слоями.
  4. 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#. Она разделяет код на независимые слои, упрощает поддержку и расширение системы.