UWP 中的 Unity 容器使用

Unity container usage in UWP

我正在尝试开发 Prism 6 UWP 应用程序。 我当前的问题是我想使用 Unity Dependency injection container 注册应用程序中使用的所有对象。 但是这么多 UI 对象是由基础设施创建的(Activator.CreateInstance(类型))并且没有办法通过依赖注入触发它们的创建 conatiner.I 即使我用 DI conatiner 注册创建的对象也没有问题. 我在 Prism 示例中引用了 Github 示例应用程序 AdventureWorks.Shopper。 在这里我看到视图是由基础设施创建的,但是其他一些对象是由依赖注入conatiner创建的。

有什么方法可以获取应用程序中的所有对象并使用 DI conatiner 注册它们?

有什么方法可以获取应用程序中的所有对象并将它们注册到 DI 容器或通过 DI conatiner 触发所有创建?

我们发现的一种方式:- 您可以像这样访问统一容器:-
unityContainer = (UnityContainer)((Prism.Unity.Windows.PrismUnityApplication)Application.Current).Container;

在 Activator.CreateInstance 创建的对象的构造函数中,我们可以使用统一容器并将该实例注册到统一容器。

这样一来,所有的对象都被注册到了unity conatiner 例子:- unityContainer.RegisterInstance(这个);

通常你不应该尝试让你的 UI 对象由容器创建,因为正如你提到的,XAML 解析过程(你称之为基础设施)负责这样做并且没有简单的方法可以进入循环来接管该施工过程。

这是我们将 ViewModelLocator 添加到 Prism 的原因之一 - 这样从 ViewModel 向下通过它的所有依赖项,您可以连接 SetDefaultViewModelFactory 方法以使用容器来构建所有 ViewModel 和它们的依赖项(以及它们的依赖项的依赖项等),只要您使用 ViewModelLocator 将视图连接到 ViewModel。

如果您很好地遵循 MVVM 模式,那么几乎永远不需要通过容器自己构造 UI 对象,因为它们不应该在背后的代码中执行任何依赖的逻辑在容器注入的东西上。但这并不是说您 永远不会 需要这样做。因此,对于那些需要这样做的情况,您可以按照 S Vasudev 的建议通过 Application.Current 进行一些转换来访问容器。或者,如果您需要在几个地方执行此操作并且不想在代码中进行所有强制转换 "noise",则可以编写一个带有静态 属性 的简单帮助对象,您可以在的 OnInitializeAsync 方法中进行设置App class 然后随时随地轻松访问。

如果您在不止几个地方这样做,您应该开始质疑您的设计。是的,静态(全局)是邪恶的,应该尽可能避免。但是,如果它只是几个视图后面代码中的几个地方,有时你需要成为一个务实的程序员来完成事情,而不是一个 MVVM 纯粹主义者,他只是为了避免一些轻微的违反 MVVM 指南而使事情过于复杂。