0

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

程序集接口(我没有人提到)

  • IViewX
  • IViewY
  • IViewModelX
  • IViewModelY

装配视图(我参考接口)

  • 视图X:IViewX
  • 视图Y:IViewY

Assembly-ViewModels(我参考 Interfaces 和 DialogService)<- 这是循环依赖

  • 视图模型X:IViewModelX
  • ViewModelY:IViewModelY

Assembly-MyUnityContainer(我参考了接口、视图和视图模型)

  • UnityService(提供对 UnityContainer 的访问)

Assembly-DialogService(我参考 Interfaces 和 MyUnityContainer)

  • 对话服务

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

注意:我的问题与设计有关,我实际上无法在 ViewModel 中添加对 DialogService 的引用,VS 不允许这样做。这不是循环依赖导致堆栈溢出的问题。只是想说清楚。

谢谢!

编辑:解决方案 根据我收到的建议,我最终做了一个类似于以下的设计。

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

MainApp 可以看到所有内容,因此它创建 UnityContainer,注册所有类型并将其作为 IUnityContainer 交给 DialogService 程序集。现在 DialogService 程序集可以在不知道具体实现的情况下解析任何接口类型。ViewModel 可以使用 DialogService 创建对话服务,进而打开窗口或其他对话。ViewModel 只需要知道它想要打开的界面并将其提供给 DialogService,对话服务会完成打开窗口的工作。

4

1 回答 1

1

我想说,理想情况下,Assembly-MyUnityContainer 是应该引用所有内容的那个。

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

为什么不将您自己的 IContainer 接口添加到您的接口程序集中,它抽象了 Unity 容器?然后让对话服务程序集只引用接口程序集......

于 2013-01-13T05:57:10.497 回答