这是自从我开始使用MVVM以来,我一直在努力的一个问题,首先在WPF中,现在在Silverlight中。MVVM和IOC:处理查看模型的类不变量
我使用IOC容器来管理Views和ViewModels的分辨率。视图往往是非常基本的,有一个默认的构造函数,但ViewModels倾向于访问真正的服务,所有这些都是构建所需的。再次,我使用IOC容器来解决问题,所以注入服务不是问题。
成为问题的是将所需数据通过IOC传递给ViewModel。作为一个简单的例子,考虑一个允许编辑客户的屏幕。除了可能需要的任何服务之外,此屏幕的ViewModel还需要客户对象来显示/编辑客户的数据。当做任何类型的(非MVVM)库开发时,我认为它是一个不可修改的规则,类不变量是通过构造函数传递的。如果我需要上下文相关的数据来建造课程时间和所讨论的类是容器管理的,我倾向于使用抽象工厂*作为桥梁。在MVVM中,这看起来像是矫枉过正,因为大多数ViewModel都需要自己的工厂。 (1)初始化/加载方法,其中我传递数据,这违反了通过构造函数强制类不变量的规则,(2)通过容器传递数据,如下所示:参数覆盖(Unity),以及(3)通过全局状态包(ugh)传递数据。
将特定于上下文的数据从一个ViewModel传递到下一个的一些备选方法是什么?是否有任何MVVM框架解决这个特定的问题?
* 它可能有它自己的问题,例如要求在对Container.Resolve()的调用之间进行选择,或者没有对ViewModel进行容器管理。温莎城堡有一个很好的解决方案,但AFAIK没有其他框架。
编辑:
我忘了补充:一些我列出的选项中甚至没有可能的,如果你正在做的“检视首个” MVVM,除非你先通过数据的视图,然后到视图模型。
谢谢你提出这个问题。我偶然发现了如何将数据传递给ViewModel的困境。幸运的是,使用autofac的自动生成委托工厂,我只有不必一路去声明一个全接口声明的工厂,但它仍然是非常冗长。 – Ants 2011-06-15 06:49:01