【问题标题】:WPF MVVM using UnityContainer in ViewModel to open new Views causes Circular DependencyWPF MVVM 在 ViewModel 中使用 UnityContainer 打开新视图导致循环依赖
【发布时间】:2013-01-13 05:48:07
【问题描述】:

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

Assembly-Interfaces(我没有提到任何人)

  • IViewX
  • IViewY
  • IViewModelX
  • IViewModelY

Assembly-Views(我参考接口)

  • ViewX : IViewX
  • ViewY:IViewY

Assembly-ViewModels(我参考 Interfaces 和 DialogService)

  • ViewModelX:IV​​iewModelX
  • ViewModelY:IViewModelY

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

  • UnityService(提供对 UnityContainer 的访问)

Assembly-DialogService(我参考 Interfaces 和 MyUnityContainer)

  • 对话服务

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

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

谢谢!

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

Design: How assemblies reference each other.

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

【问题讨论】:

    标签: wpf mvvm unity-container .net-4.5


    【解决方案1】:

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

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

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

    【讨论】:

    • 好吧,这是有道理的。只是好奇,如果 DialogService 只看到接口,它如何获得 IContainer 的实例......可以说 DialogService 是从 app.xaml.cs 中的说 OnStartup 实例化并传入 IContainer 的具体实例吗?
    • 是的,类似的东西。或者在 OnStartup 中,您仍然可以使用一个真实的容器(已经注册了这个新的 IContainer)来解析 DialogService
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多