UWP中的Unity容器使用情况

时间:2016-04-01 10:23:37

标签: winrt-xaml win-universal-app prism

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

有没有办法在应用程序中获取所有对象并使用DI conatiner注册它们?

有没有办法获取应用程序中的所有对象并使用DI容器注册它们或通过DI conatiner触发所有创建?

2 个答案:

答案 0 :(得分:2)

通常,您不应该尝试让容器创建UI对象,因为正如您所提到的,XAML解析过程(您调用它的基础架构)负责这样做,并且没有简单的方法可以进入循环接管那个施工过程。

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

如果你正好遵循MVVM模式,那么几乎不需要通过容器自己构造UI对象,因为它们不应该在后面的代码中做任何逻辑,这取决于容器注入的东西。但这并不是说你从不需要这样做。因此,对于那些你需要这样做的情况,你可以通过Application.Current进入容器,如S Vasudev建议的那样。或者,如果您需要在一些地方执行此操作并且不希望在代码中抛出所有“噪音”,那么编写一个带有静态属性的简单辅助对象,您可以在App类的OnInitializeAsync方法中设置该属性,然后轻松随处访问。

如果您在多个地方这样做,您应该开始质疑您的设计。是的静态(全局)是邪恶的,应该尽可能避免。但是如果它只是少数几个视图背后的代码中的一小部分,有时你需要成为一个务实的程序员来完成任务,而不是一个MVVM纯粹主义者为了避免一些轻微违反MVVM指导而过度复杂化。 / p>

答案 1 :(得分:0)

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

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

以这种方式,所有对象都使用unity conatiner注册 例:- unityContainer.RegisterInstance(本);