8

我正处于一个大型项目的完成阶段,该项目有几个大型组件:图像采集、图像处理、数据存储、工厂 I/O(自动化项目)和其他几个。

这些组件中的每一个都是相当独立的,但是要使项目作为一个整体运行,我至少需要每个组件的一个实例。每个组件还有一个 ViewModel 和 View (WPF) 用于监控状态和改变事物。

我的问题是实例化所有这些对象的最安全、最有效和最可维护的方法,将一个类订阅到另一个类中的事件,并为所有这些拥有一个通用的 ViewModel 和 View。

如果我有一个名为 God 的类,它拥有所有这些对象的私有实例,那会更好吗?我过去曾这样做过,并为此感到后悔。

或者如果上帝依靠这些对象的单例实例来让球滚动起来会更好吗?

或者,应该 Program.cs(或 Main(...) 所在的任何地方)实例化所有这些组件,并将它们作为参数传递给上帝,然后让他(窃笑)和他的 ViewModel 处理运行这个项目的细节。

我很想听听任何其他建议。

谢谢!

4

5 回答 5

3

使用 Microsoft 的“复合应用程序库”(又名 Prism)一个用于开发复合 WPF 应用程序的框架可以很好地解决这些问题:

http://msdn.microsoft.com/en-us/library/ff647752.aspx

http://msdn.microsoft.com/en-us/library/ff648611.aspx

  • 组成您的视图:Prism 具有应用程序外壳窗口和区域管理器的概念。shell 充当基本布局页面,您可以在其中定义命名的占位符区域,例如“MainMenu”和“TabInterface”。您在模块类中包装对视图和视图模型的引用,例如“MainMenuModule”和“TabInterfaceModule”,并定义模块应与哪个区域相关联。Prism 将在应用程序启动时创建您的视图并将它们注入到 shell 区域中。这使您可以独立地组合视图。

  • 视图模型之间的通信:Prism 支持称为“事件聚合器”的中介模式。基本上,您可以通过视图模型中的事件聚合器发布和订阅消息。这允许视图模型通过消息松散地通信,而不必了解彼此和挂钩事件。

Prism 提倡并支持以松散耦合的方式相互独立地开发组件的模式,而不引入上帝对象和过度耦合。Prism 的很大一部分还在于它使用 IOC 和依赖注入,因此单元测试也变得更加容易。

我发现以下文章是使用 Prism 和 MVVM 的一个很好的实用介绍:

http://www.developmentalmadness.com/archive/2009/10/03/mvvm-with-prism-101-ndash-part-1-the-bootstrapper.aspx

于 2010-06-01T17:22:57.977 回答
3

看看一些依赖注入框架,例如 Unity(CAL 使用)、Castle Windsor 或 Spring.NET。

于 2010-06-01T17:27:15.503 回答
2

我首选的获取 ViewModel 的方法是使用 ViewModelLocater。基本上它是你所暗示的上帝对象,但它唯一的责任是创建每个 ViewModel 并保持对它的引用。我通常将 VML 添加到 App 的资源中,每个视图负责将其 DataContext 设置为正确的 ViewModel。如果您订阅多个事件,您可以让您的 VML 手动连接它们,或者它可以创建首先引发事件的 VM 并将其传递给其构造函数中的相关 VM。

于 2010-06-01T16:05:04.433 回答
1

您可能会使用控制器(ApplicationController、Use-Case Controllers)而不是“上帝”类。控制器负责创建 ViewModel 对象并在它们之间进行调解。

WPF 应用程序框架 (WAF)项目展示了其工作原理。

于 2010-06-03T22:08:48.853 回答
0

我希望我已经很好地理解了你的问题。我认为使用 God ViewModel 不是一个好主意。最好为每个视图拥有一个视图模型,并在该视图模型中实例化所有相关的视图模型。然后您可以使用调解器在该视图的视图模型和其他视图之间发送消息,安全。我也支持使用 wpf 命令而不是事件。您可以在此处找到有关调解员的精彩文章。

于 2010-06-01T16:50:39.567 回答