# DITranquillity Спокойствие это простая, но мощная библиотека на языке swift для [внедрения зависимостей](https://ru.wikipedia.org/wiki/Внедрение_зависимости). Название "Спокойствие" выбрано не случайно - оно закладывает три базовых принципа библиотеки: понятность, простота и безопасность. Оно говорит - используйте библиотеку и вы будете спокойны за свои зависимости. > Сменить язык: [English](README.md), [Russian](README_ru.md) ## Что такое внедрение зависимостей? [Внедрение зависимостей (DI)](https://ru.wikipedia.org/wiki/Внедрение_зависимости) это паттерн проектирования при котором некто поставляет зависимости в объект. Является специфичной формой [принципа инверсии управления (IoC)](https://ru.wikipedia.org/wiki/Инверсия_управления) и помощником для [принципа инверсии зависимостей](https://ru.wikipedia.org/wiki/Принцип_инверсии_зависимостей). Более подробно об этом можно [почитать по ссылке](Documentation/ru/about_dependency_injection.md) И советую ознакомиться со [словарем](Documentation/ru/glossary.md) который поможет лучше ориентироваться в терминах. ## Возможности #### Ядро - [x] [Регистрация компонент и сервисов](Documentation/ru/core/registration_and_service.md) - [x] [Внедрение через инициализацию, свойства, методы](Documentation/ru/core/injection.md) - [x] [Опциональное внедрение, а также с аргументами, множественное, с указанием тэга/имени](Documentation/ru/core/modificated_injection.md) - [x] [Отложенное внедрение](Documentation/ru/core/delayed_injection.md) - [x] [Внедрение циклических зависимостей](Documentation/ru/core/injection.md#Внедрение-через-свойства) - [x] [Указание времени жизни](Documentation/ru/core/scope_and_lifetime.md) - [x] [Поддержка модульности](Documentation/ru/core/modular.md) - [x] [Полное и подробное логирование](Documentation/ru/core/logs.md) - [x] Одновременная работа из нескольких потоков - [x] [Иерархичные контейнеры](Documentation/ru/core/container_hierarchy.md) #### UI - [x] [Поддержка сторибоардов](Documentation/ru/ui/storyboard.md) - [x] [Внедрение в subviews и ячейки](Documentation/ru/ui/view_injection.md) #### Graph API - [x] [Получение графа зависимостей](Documentation/ru/graph/get_graph.md) - [x] [Валидация графа зависимостей](Documentation/ru/graph/graph_validation.md) - [ ] [Визуализация графа зависимостей](Documentation/ru/graph/visualization_graph.md) ## Установка Библиотека поддерживает три популярных пакетных менеджера: Cocoapods, Carthage, SwiftPM. #### CocoaPods Добавьте строчку в ваш `Podfile`: ``` pod 'DITranquillity' ``` #### SwiftPM Вы можете воспользуйтесь "Xcode/File/Swift Packages/Add Package Dependency..." и указать в качестве url: ``` https://github.com/ivlevAstef/DITranquillity ``` Или прописать в вашем `Package.swift` файле в секции `dependencies`: ```Swift .package(url: "https://github.com/ivlevAstef/DITranquillity.git", from: "4.5.2") ``` И не забудьте указать в таргете в аргументе `dependencies` зависимость на библиотеку: ```Swift .product(name: "DITranquillity") ``` > Важно! - SwiftPM не поддерживает фичи из секции UI. #### Carthage Добавьте строчку в ваш `Cartfile`: ``` github "ivlevAstef/DITranquillity" ``` Carthage поддерживает работу со сторибоардами графом и прямое внедрение, без дополнительных действий. ## Использование Библиотека использует декларативный стиль описания зависимостей, и позволяет отделить ваш прикладной код от кода описания зависимостей. Для быстрого входа давайте рассмотрим пример кода одного упрощенного VIPER экрана: ```Swift ................................................. /// Описание зависимостей let container = DIContainer() container.register(LoginRouter.init) container.register(LoginPresenterImpl.init) .as(LoginPresenter.self) .lifetime(.objectGraph) container.register(LoginViewController.init) .injection(cycle: true, \.presenter) .as(LoginView.self) .lifetime(.objectGraph) container.register(AuthInteractorImpl.init) .as(AuthInteractor.self) ................................................. /// Место запуска приложения let router: LoginRouter = container.resolve() window.rootViewController = router.rootViewController router.start() ................................................. /// Код приложения import SwiftLazy class LoginRouter { let rootViewController = UINavigationController() private let loginPresenterProvider: Provider