Что такое Onion архитектура
1️⃣ Как кратко ответить
Onion архитектура — это архитектурный стиль, который разделяет приложение на слои, где центральное место занимает доменная логика, а внешние слои отвечают за взаимодействие с внешними системами. Это способствует слабой связанности и высокой тестируемости кода.
2️⃣ Подробное объяснение темы
Onion архитектура — это подход к проектированию программного обеспечения, который помогает создавать приложения с четким разделением ответственности и слабой связанностью между компонентами. Основная идея заключается в том, чтобы изолировать доменную логику от инфраструктурных и внешних зависимостей.
Основные принципы Onion архитектуры
-
Центральное место занимает доменная логика: В центре Onion архитектуры находится доменная модель, которая представляет бизнес-логику приложения. Это ядро системы, и оно не должно зависеть от внешних слоев.
-
Слои вокруг доменной логики: Вокруг доменной модели располагаются другие слои, каждый из которых имеет свою ответственность. Эти слои могут включать в себя интерфейсы для взаимодействия с внешними системами, реализацию сервисов, доступ к данным и пользовательский интерфейс.
-
Зависимости направлены внутрь: Каждый слой может зависеть только от слоев, которые находятся ближе к центру. Это означает, что внешние слои могут зависеть от доменной логики, но не наоборот.
-
Инверсия зависимостей: Внешние слои реализуют интерфейсы, определенные в более внутренних слоях, что позволяет легко заменять реализации и тестировать систему.
Пример структуры 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 архитектура помогает создавать приложения, которые легко тестировать и поддерживать. Благодаря четкому разделению ответственности и инверсии зависимостей, можно легко заменять компоненты и адаптировать систему к изменениям. Это особенно полезно в крупных проектах, где важно поддерживать высокую гибкость и адаптивность к изменениям бизнес-требований.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться