WPF MVVM在ViewModel中使用UnityContainer打开新视图会导致循环依赖



我正在设计一个使用MVVM的WPF应用程序,我正在尝试用UnityContainer来解决我的MVVM对象。我的问题是,我的UnityContainer需要引用我所有的视图和视图模型来构建我需要的适当的对象。这很好,除非其中一个viewmodel需要打开一个新窗口。为了处理这个问题,我想到了一个DialogService,它可以从UnityContainer中获取MVVM对象,然后打开新窗口。这最终创建了一个循环依赖,因为我的ViewModel需要看到DialogService, DialogService需要看到UnityContainer,而我的UnityContainer需要看到我的视图和视图模型。我不使用Prism或任何东西,只是UnityContainer从Nuget安装。以下是我的问题的伪代码简化版本。

Assembly-Interfaces (I reference nobody)

  • IViewX
  • IViewY
  • IViewModelX
  • IViewModelY

程序集视图(I引用接口)

    ViewX: IViewX
  • ViewY: iview

Assembly-ViewModels (I reference Interfaces and DialogService) <-这是循环依赖

    ViewModelX: IViewModelX
  • viewmode: iviewmode

Assembly-MyUnityContainer (I reference Interfaces, Views, and ViewModels)

  • UnityService(提供访问UnityContainer)

Assembly-DialogService (I reference Interfaces and MyUnityContainer)

  • DialogService

显然我的设计有缺陷。我只是不确定什么是正确的方式使用UnityContainer从任何地方,因为它必须有引用无处不在,以解决我的视图和视图模型。你们中有使用UnityContainer经验的人我做错了什么你会建议我如何设计它?顺便说一句,我使用的是WPF 4.5。

注意:我的问题是设计相关的,我不能在我的ViewModel中添加对我的DialogService的引用,VS不允许它。这不是循环依赖导致堆栈溢出的问题。我只是想说清楚。

谢谢!

编辑:分辨率根据我收到的建议,我最终做了一个类似于下面的设计。

设计:程序集如何相互引用。

MainApp看到了一切,所以它创建了UnityContainer,注册了所有的类型,并把它作为一个UnityContainer交给DialogService组件。现在,DialogService程序集可以在不知道具体实现的情况下解析任何接口类型。ViewModel可以使用DialogService来创建对话服务,从而打开窗口或其他对话。ViewModel只需要知道它想要打开的接口,并将其提供给DialogService,对话服务完成打开窗口的工作。

我想说,理想情况下,Assembly-MyUnityContainer是一个应该引用一切的。

所以为了打破从Assembly-DialogService到Assembly-MyUnityContainer的依赖,你需要停止依赖Assembly-MyUnityContainer中的接口或类。

为什么不把你自己的IContainer接口添加到你的接口集合中,它抽象了Unity容器?然后让对话框服务组件只引用接口组件…

相关内容

  • 没有找到相关文章

最新更新