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

时间:2011-04-05 10:23:03

标签: c# dependency-injection unity-container ioc-container

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

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

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

应用程序运行后,所有对象都准备就绪,数据从一个对象传递到另一个对象。

我遇到的问题是:

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

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

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

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

  2. 将所需对象传递给在init时创建的第一个对象,以便稍后将对象层次结构中的对象传递给动态对象。此选项的主要内容是层次结构中的某些对象不需要这些对象。

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

2 个答案:

答案 0 :(得分:2)

似乎您需要一个标准的工厂/抽象工厂模式,在这里您可以在构造函数中传递编译时依赖项,并在创建方法中传递运行时依赖项。

class Factory
{
  ISomeService service;

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


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

答案 1 :(得分:0)

我真的不明白你的问题。但似乎你正在寻找Service Locator模式。大多数IoC框架都有某种静态对象,允许您即时创建依赖项,而不是将它们注入构造函数或属性中。

但这要求您的代码了解您的IoC。我讨厌这个要求,所以它不是可能的解决方案。在这种情况下,创建Factory,允许您为您创建依赖项是更好的解决方案。在这种情况下,解决这些依赖关系的具体方式可以由具体工厂隐藏,即使用您的特定IoC。