2010-06-01 38 views
7

我在一个大的项目有几大部件的完成阶段:图像采集,图像处理,数据存储,工厂I/O(自动化项目)和其他几个人。MVVM和避免单片上帝对象

每个组件的合理独立的,但对于该项目作为一个整体来看,我需要每个组件的至少一个实例。每个组件还具有用于监视状态和更改事物的ViewModel和View(WPF)。

我的问题是实例化所有这些对象的最安全,最有效,最可维护的方法,在另一个事件中为一个事件订阅一个类,并为所有这些对象提供一个共同的ViewModel和View。

会是最好的,如果我有一个叫神类,它具有所有这些对象的私有实例?我过去做过这件事,并对此表示遗憾。

或者它会更好,如果上帝对这些对象的单身实例依赖于让球滚动。另外,如果Program.cs(或Main(...)所在的任何位置)实例化所有这些组件,并将它们作为参数传递给上帝,然后让Him(snicker)和他的ViewModel处理运行的细节这个项目。

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

谢谢!

回答

2

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

+0

我已经尝试过每一个非第三方的方法,除了最后一个失败了一定程度之外,每一次尝试都会失败,并最终解决了与ViewModelLocater模式非常接近的问题。我确信其他人发布的第三方框架会为我节省很多工作,但为此我太迟了。这个答案是一个很好的中间立场。我认为你也学到了很难的方法。无论如何,这里我们几个月后,但 - 谢谢你! – bufferz 2010-09-18 02:36:56

0

我希望我能很好地理解你的问题。我认为使用God ViewModel并不是一个好主意。最好为每个视图提供一个单独的视图模型,并在该视图模型中实例化所有相关的视图模型。那么你可以使用中介来安全地在该视图的视图模型和其他视图之间发送消息。我也建议使用wpf命令而不是事件。你可以在here找到一篇关于介体的文章。

3

这些问题采取很好地使用护理微软的 “复合应用程序库”(又名棱镜),用于开发复合WPF应用程序的框架:

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

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

  • 创作您的观点:棱镜有一个应用程序外壳窗口和区域管理器的概念。该shell充当裸骨布局页面,您可以在其中定义命名的占位符区域,例如“MainMenu”和“TabInterface”。您可以在模块类中引用视图和视图模型,例如“MainMenuModule”和“TabInterfaceModule”,并定义模块应与哪个区域相关联。当应用程序启动时,Prism将创建您的视图并将它们注入到外壳区域。这使您可以彼此独立地编写视图。

  • viewmodels之间的通信:Prism支持称为“Event Aggregator”的中介模式。基本上,您可以通过视图模型中的事件agregator发布和订阅消息。这允许视图模型通过消息松散地进行通信,而不必相互了解并挂钩事件。

棱镜主张并支持以松散耦合的方式彼此独立地开发组件图案,而不会引入对象神和过耦合。 Prism的很大一部分也是使用IOC和依赖注入,所以单元测试也变得更加容易。

我发现下面的文章很好的实用介绍如何使用棱镜和MVVM:

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

3

看看一些依赖注入框架,如统一(这CAL使用),温莎城堡或春季。净。

1

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

工作原理如图所示WPF Application Framework (WAF)项目。