Swift 中的简单容器绑定?
Simple container bindings in Swift?
免责声明:我还在学习Swift所以如果我还没有理解Swift的某些concepts/capabilities/limitations请原谅我。
使用 Swinject 框架,如果您想将协议绑定到 class - 似乎您必须 return 闭包中的 class 实例,例如:
container.register(Animal.self) { _ in Cat() }
是否可以将两种类型传递给 register()
方法并让框架为您实例化 class?当然,它需要递归地查看 class 是否具有任何初始化程序依赖项(控制反转)。
这在 PHP 世界中是可能的,因为您有反射的概念,它允许您获得 class 类型的依赖项,允许您即时实例化它们。请问Swift有没有这个能力?
这样写就更好了:
container.register(Animal.self, Cat.self)
这还允许您从容器中解析任何 class 并解析它的依赖项(无需手动注册 class):
container.resolve(NotRegisteredClass.self)
注意: 这仅对不将标量类型作为依赖项的 classes 有意义(因为它们当然需要明确给出)。
第二种情况——在没有显式注册的情况下解析类型——目前是不可能的,因为Swift对反射的支持非常有限。
但是,有一个 SwinjectAutoregistration 扩展,可以让您写出与您的第一个示例非常接近的内容:
container.autoregister(Animal.self, initializer: Cat.init)
免责声明:我还在学习Swift所以如果我还没有理解Swift的某些concepts/capabilities/limitations请原谅我。
使用 Swinject 框架,如果您想将协议绑定到 class - 似乎您必须 return 闭包中的 class 实例,例如:
container.register(Animal.self) { _ in Cat() }
是否可以将两种类型传递给 register()
方法并让框架为您实例化 class?当然,它需要递归地查看 class 是否具有任何初始化程序依赖项(控制反转)。
这在 PHP 世界中是可能的,因为您有反射的概念,它允许您获得 class 类型的依赖项,允许您即时实例化它们。请问Swift有没有这个能力?
这样写就更好了:
container.register(Animal.self, Cat.self)
这还允许您从容器中解析任何 class 并解析它的依赖项(无需手动注册 class):
container.resolve(NotRegisteredClass.self)
注意: 这仅对不将标量类型作为依赖项的 classes 有意义(因为它们当然需要明确给出)。
第二种情况——在没有显式注册的情况下解析类型——目前是不可能的,因为Swift对反射的支持非常有限。
但是,有一个 SwinjectAutoregistration 扩展,可以让您写出与您的第一个示例非常接近的内容:
container.autoregister(Animal.self, initializer: Cat.init)