Нашел новый DI, который пробую в новом pet проекте. API просто мёд 🍯. Еще понравилось, что он compile time проверяет наличие зависимостей (те кто в рантайм ловили ошибки в Swinject, точно поймут зачем эти проверки).
Из близких аналогов это Needle от Uber, но там такой сложный и не самый красивый API, что всегда возникала мысль его переписать.
Основные фичи:
👉 Compile-time safe
👉 Thread safe
👉 Поддержка многомодульности
👉 Поддержка инверсии зависимостей
👉 Cycle detection
👉 Простое тестирование: каждый тип имеет инициализатор
👉 Clear error messages: не нужно дебажить сгенерированный код
Основан DI на макросах. Например, для регистрации сервиса в DI контейнере нужно просто пометить его макросом (как и его зависимости которые нужно подключить из DI):
@Instantiable
public final class UserService: Instantiable {
@Instantiated private let authService: AuthService
}
Вот и все! Нет файлов Assembly, нет лишнего кода, и если что то пойдет не так, то приложение просто не скомпилируется и выдаст понятную ошибку.
Ну что, пора переходить со Swinject и Needle? 😂
#tools