Swinject: как правильно организовать DI


#1

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

AppDelegate.swift
static let container: Container = { // register everything... }()

MyViewController.swift
// Properties let userManager = AppDelegate.container.resolve(UserManager.self)!

Главный вопрос где резолвить dependency, можно ли это делать как я описал сразу при инициализации в полях, или правильнее вынести в viewDidLoad?
Видел что используют SwinjectStoryboard но в моем проекте часть контроллеров инициализируется через код а часть через борды, поэтому хочется единого подхода.


#2

Какие проблемы вы хотите решить с помощью DI?


#3

Тут несколько проблем, одна из которых куча viewControllerov, которые зависят от разных менеджеров и других объетов. DI через контруктор не подойдет, так как зависимостей может быть довольно много. С DI же, если какая-то зависимость в будущем измениться, придется исправить только в одном месте. Ну и еще просто интересно как этот Swinject правильно использовать =)
Нашел еще такой способ:
AppDelegate.swift

class func sharedInstance() -> AppDelegate {
    return UIApplication.shared.delegate as! AppDelegate
}
class func resolve<ObjectType>(_ type: ObjectType.Type) -> ObjectType {
    return self.sharedInstance().container.resolve(type)!
}

ViewController.swift

lazy var userManager = {
        return AppDelegate.resolve(UserManagerProtocol.self)
}()

#4

И если инжектить зависимости их станет меньше?

Можно обернуть зависимости в класс обертку и использовать её, придется исправлять так же в одном месте.

Тут в соседнем посте написали :slight_smile:


#5

Нет, но отрезолвить зависимости можно будет один раз.

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