← Назад ко всем вопросам

Что такое Onion архитектура

1️⃣ Как кратко ответить

Onion архитектура — это архитектурный стиль, который разделяет приложение на слои, где центральное место занимает доменная логика, а внешние слои отвечают за взаимодействие с внешними системами. Это способствует слабой связанности и высокой тестируемости кода.

2️⃣ Подробное объяснение темы

Onion архитектура — это подход к проектированию программного обеспечения, который помогает создавать приложения с четким разделением ответственности и слабой связанностью между компонентами. Основная идея заключается в том, чтобы изолировать доменную логику от инфраструктурных и внешних зависимостей.

Основные принципы Onion архитектуры

  1. Центральное место занимает доменная логика: В центре Onion архитектуры находится доменная модель, которая представляет бизнес-логику приложения. Это ядро системы, и оно не должно зависеть от внешних слоев.

  2. Слои вокруг доменной логики: Вокруг доменной модели располагаются другие слои, каждый из которых имеет свою ответственность. Эти слои могут включать в себя интерфейсы для взаимодействия с внешними системами, реализацию сервисов, доступ к данным и пользовательский интерфейс.

  3. Зависимости направлены внутрь: Каждый слой может зависеть только от слоев, которые находятся ближе к центру. Это означает, что внешние слои могут зависеть от доменной логики, но не наоборот.

  4. Инверсия зависимостей: Внешние слои реализуют интерфейсы, определенные в более внутренних слоях, что позволяет легко заменять реализации и тестировать систему.

Пример структуры Onion архитектуры

Рассмотрим пример приложения, которое управляет заказами в интернет-магазине.

  • Доменная модель: В центре находится доменная модель, которая включает в себя классы, представляющие заказы, продукты и клиентов. Эти классы содержат бизнес-логику, такую как расчет стоимости заказа или проверка наличия товара.

  • Сервисный слой: Следующий слой может содержать сервисы, которые реализуют бизнес-логику, используя доменные объекты. Например, сервис управления заказами может использовать объекты заказа и клиента для выполнения операций.

  • Инфраструктурный слой: Этот слой отвечает за взаимодействие с внешними системами, такими как базы данных или внешние API. Он может содержать реализации репозиториев, которые используют интерфейсы, определенные в сервисном слое.

  • Пользовательский интерфейс: Внешний слой может включать в себя компоненты пользовательского интерфейса, которые взаимодействуют с сервисами для отображения данных и получения пользовательского ввода.

Пример кода

// Доменная модель
public class Order {
    private List<Product> products;
    private Customer customer;
​
    public Order(List<Product> products, Customer customer) {
        this.products = products;
        this.customer = customer;
    }
​
    // Метод для расчета общей стоимости заказа
    public double calculateTotalPrice() {
        return products.stream().mapToDouble(Product::getPrice).sum();
    }
}
​
// Интерфейс репозитория в доменной модели
public interface OrderRepository {
    void save(Order order);
    Order findById(String orderId);
}
​
// Сервисный слой
public class OrderService {
    private final OrderRepository orderRepository;
​
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
​
    // Метод для создания нового заказа
    public void createOrder(List<Product> products, Customer customer) {
        Order order = new Order(products, customer);
        orderRepository.save(order);
    }
}
​
// Инфраструктурный слой
public class DatabaseOrderRepository implements OrderRepository {
    // Реализация методов для сохранения и поиска заказов в базе данных
    @Override
    public void save(Order order) {
        // Логика сохранения заказа в базе данных
    }
​
    @Override
    public Order findById(String orderId) {
        // Логика поиска заказа в базе данных
        return null; // Возвращает найденный заказ
    }
}
  • Order: Класс, представляющий заказ, содержит бизнес-логику для расчета общей стоимости.
  • OrderRepository: Интерфейс, определяющий методы для работы с заказами, который будет реализован в инфраструктурном слое.
  • OrderService: Сервис, использующий репозиторий для создания и управления заказами.
  • DatabaseOrderRepository: Реализация интерфейса OrderRepository, которая взаимодействует с базой данных.

Применение и преимущества

Onion архитектура помогает создавать приложения, которые легко тестировать и поддерживать. Благодаря четкому разделению ответственности и инверсии зависимостей, можно легко заменять компоненты и адаптировать систему к изменениям. Это особенно полезно в крупных проектах, где важно поддерживать высокую гибкость и адаптивность к изменениям бизнес-требований.

Тема: Паттерны/SOLID
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки