Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як упроваджується DI в Clean Architecture?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Dependency Injection (DI)** у Clean Architecture - це спосіб реалізувати Dependency Rule на практиці: внутрішні шари (use cases, entities) визначають абстракції (інтерфейси), а зовнішні шари передають їм конкретні реалізації. **Ключове:** упровадження завжди відбувається на зовнішньому рівні - у контролері, DI-контейнері чи точці запуску, - тому бізнес-логіка залежить лише від абстракцій, а не від конкретних реалізацій.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняУ **Clean Architecture** упровадження залежностей (**Dependency Injection, DI**) - це спосіб реалізувати **Dependency Rule** на практиці: внутрішні шари визначають *абстракції*, а зовнішні - *передають їм конкретні реалізації*. --- ### 1. **Принцип** > Бізнес-логіка (use cases, entities) не створює залежності сама. > Усе, що їй потрібно, **передається ззовні**. Це дозволяє внутрішньому коду працювати з інтерфейсами, не знаючи, який саме репозиторій, API чи сервіс під капотом. --- ### 2. **Як це виглядає за шарами** #### Внутрішній шар (Use Case) Визначає **інтерфейси**, але не знає реалізацію: ```python class OrderRepository(Protocol): def save(self, order): ... ``` #### Зовнішній шар (Adapter / Infrastructure) Реалізує ці інтерфейси: ```python class SqlOrderRepository(OrderRepository): def save(self, order): db.insert(order) ``` #### Точка збирання (Composition Root) Десь зовні (наприклад, у [main.py](http://main.py)) залежності пов'язуються: ```python def main(): repo = SqlOrderRepository() use_case = CreateOrderUseCase(order_repo=repo) controller = OrderController(use_case) ``` Так use case отримує готову залежність, не створюючи її всередині себе. --- ### 3. **Де відбувається впровадження** Впровадження завжди виконується **на зовнішньому рівні**: - У веб-застосунку - у контролері або DI-контейнері (FastAPI, Spring, NestJS). - У CLI - у точці запуску (`main()`). - У тестах - через мок-об'єкти. --- ### 4. **Навіщо це потрібно** - Дотримується **Dependency Rule** (внутрішній шар не залежить від зовнішнього). - Спрощує **тестування** (можна підставляти моки). - Дозволяє **легко змінювати реалізацію** (наприклад, перейти з SQL на NoSQL). - Робить архітектуру **розширюваною і гнучкою**. --- **Підсумок:** > У Clean Architecture залежності впроваджуються **ззовні всередину**, > через конструктори, DI-контейнери або функції ініціалізації, > щоб бізнес-логіка залежала лише від **абстракцій**, а не від конкретних реалізацій.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.