我正在尝试开发Prism 6 UWP应用程序。我当前的问题是,我希望使用容器注册应用程序中使用的所有对象。但是有那么多UI对象是由infrastructure(Activator.CreateInstance(type))创建的,无法通过依赖注入管理员触发它们的创建,即使我将创建的对象注册到DI管理员那里也行。我在棱镜样本中引用了Github示例应用程序AdventureWorks.Shopper。在这里,我看到视图是由基础设施创建的,而其他一些对象则是由依赖注入管理员创建的。
有任何方法可以获取应用程序中的所有对象并向DI管理员注册它们吗?
是否有任何方法获取应用程序中的所有对象并将其注册到DI容器中,或者通过DI conatiner触发所有创建?
发布于 2016-04-25 12:06:02
通常,您不应该尝试让您的UI对象由容器创建,因为正如您提到的,XAML解析过程(您称之为基础结构)负责这样做,并且没有一种简单的方法可以在循环中接管该构造过程。
这是我们将ViewModelLocator添加到Prism的原因之一--因此,从ViewModel到它的所有依赖项,您可以连接SetDefaultViewModelFactory方法来使用容器来构造所有的ViewModels及其依赖项(以及它们的依赖项,等等)。只要您使用ViewModelLocator将视图连接到ViewModel。
如果您很好地遵循MVVM模式,那么几乎不应该需要通过容器来构造UI对象本身,因为它们不应该在后面的代码中执行任何依赖于容器注入的东西的逻辑。但这并不是说你永远不需要那样做。因此,对于那些您需要这样做的情况,您可以按照some的建议,通过一些强制转换通过Application.Current访问容器。或者,如果您需要这样做几个地方,并且不想在代码中抛出“噪音”,那么编写一个简单的helper对象,它具有静态属性,您可以在access的OnInitializeAsync方法中设置该属性,然后轻松地访问任何地方。
如果你在更多的地方这样做,你应该开始质疑你的设计。是的,静力学(全球)是邪恶的,只要有可能就应该避免。但是,如果只是代码中的几个视图后面的几个地方,那么有时您需要成为一个务实的程序员,完成任务,而不是一个MVVM纯粹主义者,为了避免一些轻微的违反MVVM指南的行为而使事情变得过于复杂。
发布于 2016-04-22 11:19:28
我们发现的一种方法是:-你可以像这样进入统一容器:-
(UnityContainer)((Prism.Unity.Windows.PrismUnityApplication)Application.Current).Container;= unityContainer
在Activator.CreateInstance创建的对象的构造函数中,我们可以使用统一容器并将该实例注册到统一容器。
通过这种方式,所有对象都可以通过统一示例注册:- unityContainer.RegisterInstance(this);
https://stackoverflow.com/questions/36353864
复制相似问题