使用Unity进行依赖注入,并在较低层中动态创建对象



我刚刚开始使用Unity(用于依赖注入),并且我已经成功地使其在MVC和WCF中完美工作。所有的东西都是在接口中提取出来的,使用构造函数注入,所有的对象都是为我在应用程序入口点的容器中设置的东西创建的。

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

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

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

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

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

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

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

在Unity中,您可以声明对Func<TDependency>的依赖关系,并且在任何时候调用它时都会得到一个解析依赖关系的委托。因此,您可以向您选择的生存期管理器注册TDependency(每个线程、每个调用、瞬态等)-如果您不想干扰默认注册,则可以命名注册-并在这些"特定点"使用它。

在类中注入工厂有什么问题?DI和工厂模式配合得很好。

最新更新