如何在运行时(初始化之后)注入对象

本文关键字:之后 注入 对象 初始化 运行时 | 更新日期: 2023-09-27 17:49:16

我在我目前正在进行的两个项目中使用依赖注入技术。

我使用Unity作为我的IoC框架。

我正在使用一个名为ComponentBuilder的类,它负责创建应用程序对象及其事件订阅,作为应用程序初始化的一部分。

一旦应用程序运行,所有的对象都准备好了,数据从一个对象传递到另一个对象。

我的问题是:

有些对象是在初始化之后动态创建的,这些对象需要其他已经存在的对象。

由于ComponentBuilder已经完成了它的部分,我需要找到一种方法将所需的对象传递给这些"动态"对象。这些动态对象实际上是在运行时创建的对象的层次结构,层次结构中最深的对象需要一个来自层次结构顶部的组件(对象)。

我想到了两种可能的解决方案(我不是都喜欢):

  1. 将ComponentBuilder中所有对象的容器传递给动态对象,以便它们可以使用和订阅所需的对象。此选项的主要优点是公开所有对象,从而隐藏对象之间的依赖关系。我看到有些人把对象容器传递给所有对象,就好像它是一个记录器或显示器一样,我认为这是错误的,隐藏了我们想要暴露给其他对象的依赖关系。

  2. 将需要的对象传递给在初始化时创建的第一个对象,以便稍后它将对象沿着对象层次结构传递给动态对象。这个选项的主要缺点是层次结构下面的一些对象不需要这些对象。

你能想到一个更好的解决方案吗?

如何在运行时(初始化之后)注入对象

似乎你需要一个标准的工厂/抽象工厂模式,在构造函数中传递编译时依赖关系,在创建方法中传递运行时依赖关系。

class Factory
{
  ISomeService service;
  public Factory(ISomeService service)
  {
    this.service = service;
  }

  public SomeObject CreateItem(object runtimeDependency)
  {
    return new SomeObject(service, runtimeDependency);
  }
}

我不太明白你的问题。但您似乎在寻找服务定位器模式。大多数IoC框架都有某种静态对象,允许您动态创建依赖,而不是将它们注入构造函数或属性中。

但是这有一个要求,你的代码知道你的IoC。我讨厌这个要求,所以它不是可能的解决方案。在这种情况下,创建工厂是更好的解决方案,它允许您为自己创建依赖项。在这种情况下,可以通过具体工厂隐藏这些依赖项解析的具体方式,即在内部使用您特定的IoC。