我从来没有使用过ioc-Container,但是根据我所读到的,后缀为“Container”的对象在我看来是一个从配置/上下文中读取的工厂,它的魔力并根据具体类型返回一个具体类型的对象。读取配置/上下文。
我错过了哪些关键方面? 使用容器似乎增加了复杂性(这对于开发,重构和配置来说是耗时的),在哪里使用以及哪些是关键的好处?
答案 0 :(得分:2)
IoC容器和工厂都构建了其他对象,但这些相似之处已经结束。
工厂是一个知道如何构建其他对象的对象。它封装了额外的逻辑,可能是配置时间信息等。它可以构建几个相关类型的对象,例如来自对象的层次结构。但它可以构建的对象数量是工厂结构的一部分。所以你可能有一个SqlConnectionFactory或一个RequestHandlerFactory,它知道要构建什么类型的SqlConnections或RequestHandlers,但如果你想构建InputValidators,你需要建立一个新的工厂。
IoC容器是一种用于帮助控制模式反转的工具。但并非严格要求。 IoC使您明确了对象所具有的依赖关系,并使您在创建/初始化对象时提供这些依赖关系。如果做得好,这有助于分离关注点,组件之间的分离,单元测试等,并且通常会使得到的代码更好"。但是由于手动连接对象图是一件麻烦事,因此出现了许多自动执行此操作的框架,无论是外部配置还是代码注释。这些被称为IoC容器。他们初始化对象的方式比工厂更通用。您可以要求它构建任何类型的对象,只要它知道这些对象的某些内容(构造函数的签名,在最简单的情况下),它就可以构建它们。
通常情况下,看到IoC容器使用工厂,而不是相反。在我所看到的大部分代码中,除了最复杂的对象外,对工具的需求大大减轻了。