swift - Swift 中的简单容器绑定(bind)?

标签 swift dependency-injection swinject

免责声明:我仍在学习 Swift,如果我不了解 Swift 的某些概念/功能/限制,请原谅我。

使用 Swinject 框架,如果您想将协议(protocol)绑定(bind)到类 - 似乎您必须在闭包中返回类实例,例如:

container.register(Animal.self) { _ in Cat() }

是否可以将两种类型传递给 register() 方法并让框架为您实例化该类?当然,它需要递归地查看该类是否具有任何初始化程序依赖项(控制反转)。

这在 PHP 世界中是可能的,因为您有反射的概念,它允许您获取依赖项的类类型,允许您即时实例化它们。不知Swift有没有这个能力?

这样写会好很多:

container.register(Animal.self, Cat.self)

这还允许您解析容器中的任何类并解析它的依赖项(无需手动注册该类):

container.resolve(NotRegisteredClass.self)

注意:这仅对不将标量类型作为依赖项的类有意义(因为它们当然需要明确给出)。

最佳答案

第二种情况——在没有显式注册的情况下解析类型——目前是不可能的,因为 Swift 对反射的支持非常有限。

然而,有一个SwinjectAutoregistration扩展,这将使您能够编写与您的第一个示例非常接近的内容:

container.autoregister(Animal.self, initializer: Cat.init)

关于swift - Swift 中的简单容器绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49321754/

相关文章:

对注入(inject)了另一个 ejb 的 ejb3.0 进行单元测试

swift - 没有参数的 Swinject 服务类无法使用 Swift 3.0 : why? 在 .container 范围内注册

swift - Swinject 测试解决服务

iOS - swift 3 - DispatchGroup

ios - Sample Buffer Delegate Swift 2 用于实时视频过滤器

swift - 如何在 swift 中为 UIVIew 制作曲线顶部?

Java Spring 多个ApplicationContext

ios - Swift 数组 - 使用 AnyObject 类型的 "Contains"

java - 了解Java的注入(inject)框架HK2吗?

swift - 解析符合协议(protocol)的类和对象