在IoC顶部的抽象工厂模式?

我决定在一个更大的项目上使用IoC原则。 不过,我想弄清楚一直困扰着我的东西。 我得出的结论是,一个IoC容器是一个架构模式,而不是一个devise模式。 换句话说,没有一个类应该知道它的存在,并且应用程序层使用容器本身来拼接所有组件。 本质上,它是一个select,在一个devise良好的面向对象模型之上。 话虽如此,如何在不将IoC容器遍布整个地方的情况下(无论是否抽象)访问已parsing的types呢? 我在这里看到的唯一select是利用使用IoC容器来parsing具体types的抽象工厂。 这应该很简单,可以换出一套标准的工厂。 这是一个好方法吗? 有没有人在这里使用它,它对你有多好? 还有其他的东西吗?

谢谢!

正如你已经想到的,dependency injection(DI)本身只是模式和技术的集合。

在应用程序的根源处,我们连接所有必要的对象图。 这个地方被称为组合根 ,我们可以使用一个DI容器为我们做这个接线,或者我们可以手动( 穷人的DI )。

问题是,在你的应用程序中,只有一个地方对特定的技术(DI容器)有很强的参考。 应用程序的其余部分完全没有意识到对象图是如何连接起来的 – 重要的是所有必需的依赖关系都被正确地注入了(你可以使用带有Null Guard的 构造函数注入来保证这一点)。

当谈到DI时, 抽象工厂模式是非常有用的模式。 实质上,在以下情况下使用Abstract Factory:

  • 您需要提供一个或多个只在运行时已知的参数,然后才能parsing依赖关系。
  • 依赖关系的生命周期在概念上比消费者的生命周期短。

示例和更多信息可在此处获得:

  • 是否有初始化通过DI容器创build的对象的模式
  • 不能合并工厂/ DI
  • 哪个DI容器可以满足这个要求
  • 我应该在哪里做Ninject 2+注射(以及如何安排我的模块?)
  • devise – 在使用温莎时应将物品登记在哪里

那么在你的应用程序的最顶部你将需要一个Bootstrap类来加载IOC上下文。 这个上下文然后将提供实际实例化的对象,因此作为一个工厂。

但是这应该只发生在很less的对象上,Bootstrap / Factory类的用户应该尽可能less地了解底层架构。 例如,如果您通过IOC完全configuration了HTTP服务器对象,并且您想启动它,那么Bootstrap类只需要提供getHttpServer()方法。 那么你的程序main方法只需要调用Bootstrap.getHttpServer()。start()就可以运行。

其他对象的接线已经由应用程序上下文完成,例如,您通过作为对象B的一部分的IOC来configuration对象A,因此您可以使用对象A的引用来configuration对象B.通常他们都不需要知道容器也不是工厂。