避免循环引用,而 类 必须相互通信(依赖注入)
Avoid circular refence while classes have to communicate with eachother (Dependency injection)
我正在开发一个用 C# 和 WPF 编写的应用程序。
有一个视图的布局由三个独立的部分(子视图)组成。
- 包含当前主要内容的“内容”视图(例如,产品列表视图)。
- 位于其顶部的视图,包含工具和选项
控件。
- 左侧主菜单视图。
我为我的应用程序使用 .NET 依赖项注入(Microsoft.Extensions.DependencyInjection
、Microsoft.Extensions.Configuration.Abstractions
)
当为内容视图设置一个ViewModel 时,我还想为顶视图设置一个ViewModel。这些 ViewModel 必须 communicate/reference 彼此。
就像,当顶层 ViewModel 上的命令被执行时,应该通知内容 ViewModel and/or 做某事,并且 vice-versa。
假设我有一个 TopViewModel
和一个 ContentViewModel
。
我能做的一件坏事是:
- 需要
TopViewModel
的构造函数中的 ContentViewModel
- 并要求
ContentViewModel
的构造函数中的 TopViewModel
。
当然不行,因为这是循环引用。
我能想到的替代方案是只需要在 ContentViewModel
的构造函数中使用 TopViewModel
并且不要对另一个 class 做同样的事情。
ContentViewModel
的构造函数代码随后可以监听 TopViewModel
的事件。 TopViewModel 对 ContentViewModel
一无所知,如果它出于某种逻辑原因需要引用它,这可能是个问题。
某些内容视图可以有 多个 顶部视图(它们会像用户选择某些东西时一样变化)
我非常认真地对待这件事。我能想到的一切对我来说都是丑陋和糟糕的做法。虽然我认为这是一个非常简单和普遍的情况。
在不违反 OOP 规则的情况下,最好的、普遍接受的解决方案是什么?
What is the best, generally accepted solution to this that doesn't break the OOP rules?
与其存储从一个视图模型到另一个视图模型的直接引用,不如考虑使用事件聚合器以松散耦合的方式在视图模型之间进行通信。
这消除了视图模型之间的紧密耦合 类 并使您的应用程序更易于维护和随时间发展。
这个想法是订阅者观察事件聚合器而不是发布者,发布者只知道事件聚合器而不是订阅者。请参考以下博客post了解更多信息。
Using the event aggregator pattern to communicate between view models
我正在开发一个用 C# 和 WPF 编写的应用程序。
有一个视图的布局由三个独立的部分(子视图)组成。
- 包含当前主要内容的“内容”视图(例如,产品列表视图)。
- 位于其顶部的视图,包含工具和选项 控件。
- 左侧主菜单视图。
我为我的应用程序使用 .NET 依赖项注入(Microsoft.Extensions.DependencyInjection
、Microsoft.Extensions.Configuration.Abstractions
)
当为内容视图设置一个ViewModel 时,我还想为顶视图设置一个ViewModel。这些 ViewModel 必须 communicate/reference 彼此。
就像,当顶层 ViewModel 上的命令被执行时,应该通知内容 ViewModel and/or 做某事,并且 vice-versa。
假设我有一个 TopViewModel
和一个 ContentViewModel
。
我能做的一件坏事是:
- 需要
TopViewModel
的构造函数中的 - 并要求
ContentViewModel
的构造函数中的TopViewModel
。
ContentViewModel
当然不行,因为这是循环引用。
我能想到的替代方案是只需要在 ContentViewModel
的构造函数中使用 TopViewModel
并且不要对另一个 class 做同样的事情。
ContentViewModel
的构造函数代码随后可以监听 TopViewModel
的事件。 TopViewModel 对 ContentViewModel
一无所知,如果它出于某种逻辑原因需要引用它,这可能是个问题。
某些内容视图可以有 多个 顶部视图(它们会像用户选择某些东西时一样变化)
我非常认真地对待这件事。我能想到的一切对我来说都是丑陋和糟糕的做法。虽然我认为这是一个非常简单和普遍的情况。 在不违反 OOP 规则的情况下,最好的、普遍接受的解决方案是什么?
What is the best, generally accepted solution to this that doesn't break the OOP rules?
与其存储从一个视图模型到另一个视图模型的直接引用,不如考虑使用事件聚合器以松散耦合的方式在视图模型之间进行通信。
这消除了视图模型之间的紧密耦合 类 并使您的应用程序更易于维护和随时间发展。
这个想法是订阅者观察事件聚合器而不是发布者,发布者只知道事件聚合器而不是订阅者。请参考以下博客post了解更多信息。
Using the event aggregator pattern to communicate between view models