Swinject: генерировать экземпляры любого объекта (для незарегистрированного объекта, ViewModel и т. Д.)
Возможно разрешить / создать новый объект, который не зарегистрирован в контейнере Swinject? В Unity инъекция зависимостей для C# (от Microsoft) такова.
Я хочу разрешить класс viewModel, который зависит от некоторых протоколов. Например: я зарегистрировал IFileManager в контейнере:
container.register(IFileManager.self) { _ in FileManager() }.inObjectScope(ObjectScope.container)
а у меня у viewModel есть зависимость для IFileManager
class AwesomeViewModel{
init (fileManager: IFileManager) {
....
}}
Теперь я хочу создать новый экземпляр AwesomeViewModel с помощью распознавателя Swinject, и я хочу, чтобы все зависимости были добавлены в init, но это не работает
viewModel = AppDelegate.container.resolve(AwesomeViewModel.self)
и ViewModel ноль
1 ответ
Нет, Swinject не может определить, какой метод инициализации вы ожидаете использовать для создания экземпляра AwesomeViewModel
, Вы должны явно определить это сначала:
container.register(AwesomeViewModel.self) {
AwesomeViewModel(fileManager: $0.resolve(IFileManager.self)!)
}
По общему признанию, это может стать довольно громоздким, если у вас есть классы со многими зависимостями. Если это становится проблемой, я предлагаю вам проверить расширение https://github.com/Swinject/SwinjectAutoregistration. Это позволяет вам написать:
container.autoregister(AwesomeViewModel.self, initializer: AwesomeViewModel.init)