【问题标题】:Dependency Injection with Unity and creating objects dynamically in a lower layer使用 Unity 进行依赖注入并在底层动态创建对象
【发布时间】:2012-02-15 12:20:20
【问题描述】:

我刚刚开始使用 Unity(用于依赖注入),并且我已经设法让它在 MVC 和 WCF 上完美运行。一切都在接口中提取出来,并且使用构造函数注入,所有对象都是在我在应用程序入口点在容器中设置的链中创建的。

我现在的问题是我有一个 WPF 应用程序。我正在尝试做类似的事情,它适用于大多数事情,但我有一种情况我不能 100% 确定如何处理以正确使用 DI。

比如说,我的 WPF 应用程序解析 A 类,它通过构造函数注入接收 B、C 类等的接口。现在说,这些对象在应用程序的整个生命周期中都存在。现在在运行时的某个时刻,B 类需要动态创建 D 类的新版本以在其自己的线程中运行。如何正确地做到这一点?

我能想到的唯一方法是,类A也接受一个新的接口E,而这个类所做的只是创建类D,并在需要时将其作为接口D返回。

但这似乎更像是一种工厂模式,而不是 DI。

为了给出一些上下文,假设应用程序在应用程序的最高级别注入解析所需的业务逻辑类和存储库类。现在在运行时的某个时刻,它需要在自己的线程上生成一个新的存储库对象,以做一些非常具体的事情。这可能是一个线程,也可能是多个线程,具体取决于程序正在执行的操作。

我的建议是通过 DI 注入一个创建类,该类将实现 GetNewRepositoryObjectOnNewThread() 或类似的接口方法,具体实现基本上是存储库的硬编码实现。

有什么想法吗?我知道有很多文字需要通读!

【问题讨论】:

标签: dependency-injection unity-container


【解决方案1】:

在 Unity 中,您可以声明对 Func<TDependency> 的依赖关系,并且您会在任何时候调用它来解决依赖关系的委托。因此,您可以使用您选择的生命周期管理器(每个线程、每个调用、瞬态等)注册 TDependency - 如果您不想打扰您的默认注册,可以命名注册 - 并在这样的情况下使用它“具体点”。

【讨论】:

  • 我现在正在调查这个。
【解决方案2】:

在你的类中注入工厂有什么问题? DI and the factory pattern play well together.

【讨论】:

  • 我刚开始使用 DI,我不确定在某些情况下的最佳实践。如果在这种情况下混合两者是好的做法,那么很好,如果不是,那我该怎么做。这基本上是我开始这篇文章的原因。我不想做的是走一条路,后来发现这是不好的做法,或者有更好的方法
猜你喜欢
  • 2015-01-22
  • 1970-01-01
  • 2018-06-25
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2010-12-07
相关资源
最近更新 更多