dependency-injection - 使用依赖注入(inject)时使用工厂创建多个对象

标签 dependency-injection inversion-of-control ioc-container

我试图弄清楚在使用依赖注入(inject)时如何创建多个对象。据我了解,标准方法是注入(inject)一个工厂,然后用于创建对象。我挣扎的部分是工厂如何创建对象。到目前为止,我看到了两种可能的解决方案:

工厂只是使用 new() 来创建对象。

  • 难道 DI 不应该让我摆脱对非值(value)对象使用 new 的束缚吗?
  • 如果要创建的对象具有可由 IoC 解决的依赖关系,会发生什么?

  • 使用容器作为服务定位器
  • 以引入反模式为代价解决了仅更新对象的问题,或者如果工厂内限制使用 serviclocater,则它不再是反模式?

  • 感觉就像我可以在一个糟糕的解决方案和一个糟糕的解决方案之间徘徊。我有什么遗漏或者我在这里理解错了吗?

    编辑 目前我根本没有使用 Ioc,而是在考虑 Ninject。尽管 Autofac DelegateFactories 听起来很有希望。

    最佳答案

    对于初学者,我不认为在工厂中使用容器作为服务定位器是一种反模式。在真正的情况下,它是完全合适的。想一想,容器感知工厂实际上是容器扩展,而那些似乎被排除在服务定位器抨击之外。即使是最纯粹的 IoC 框架,如 AutoFac 或 Ninject,也具有广泛的扩展能力。这种模式最典型的用例是根据使用服务的位置解析不同的实现。

    关于使用 new在工厂内部创建实例,这也是可以接受的。那里的 IoC/DI 消息有点失真,从不使用 new 确实是副作用,而不是 DI 的目标。依赖注入(inject)的首要任务是将组件的依赖创建外部化。只要工厂本身被注入(inject)到组件中,它就可以满足这一要求。在评估此类场景时,您需要问自己的问题是:

  • 组件本身是否会创建其依赖项? 答:不,工厂有。
  • 你可以在不修改组件的情况下使组件与不同的依赖项一起工作吗? 答:是的,通过注入(inject)不同的工厂。

  • 我之前说过,IoC 容器只是类固醇的工厂。对于 80% 的用例,它们开箱即用。其他 20% 可能需要对上述两个品种进行调整。当我想创建既需要注册依赖项又需要一些运行时输入和new 的组件时,我倾向于使用容器感知工厂。 - 当我创建不依赖于其他服务但在运行时获取所有构造参数的域对象时创建工厂。

    关于dependency-injection - 使用依赖注入(inject)时使用工厂创建多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276853/

    相关文章:

    java - Guice:如何根据(动态网络属性)在运行时更改注入(inject)

    dependency-injection - 在进行构造函数或 setter 注入(inject)时,依赖项的正确粒度是多少?

    c# - 具有注册上下文(又称Func <T>)的RegisterAll的能力在哪里?

    c# - 在抽象工厂模式中使用 IoC?

    ioc-container - 我应该封装我的 IoC 容器吗?

    android - 房间改造 Dagger2 MVP : Error: cannot find symbol variable DaggerAppComponent

    java - 在 Struts 2 中发送带有嵌入式 URL 的邮件

    android - Dagger如何注入(inject)多个构造函数

    c# - 使用 Prism 设置数据上下文

    c# - 如何对一系列依赖于用户输入并相互依赖的进程使用控制反转?