我从线程When using MVVM pattern, should code relating to property changes go in the setter or an event?
分叉使用View和ViewModel部件我对MVVM模式的理解是正确的......
但是Model部分怎么样?它是技术对象模型(EntityFramework SelfTracking生成的类,然后位于Web服务后面,然后是服务器中的所有业务逻辑)或应用程序逻辑模型(我们将基于实体类在Silverlight客户端上重新创建它们当然-thanks PRISM项目链接器 - 它将呈现面向GUI的操作,有更多的业务逻辑可用,并将封装脏技术内容以访问WS以将实体上的修改传播到数据库)?
(Personnaly,我正在考虑第二个)
在我们的Silverlight / WCF(非RIA)项目中,我们管理文档。我们有用于显示这些文档的视图(例如InboxView.xaml),它包含一个InboxViewModel.cs,其中包含要显示的文档列表。 InboxView中的ListBox是DataBound,是InboxViewModel中的DocumentList ObservableCollection属性。但是列表框ItemTemplate是DataBound到DocumentViewModel.cs,它封装了实体生成的Document.cs类。
点是这个DocumentViewModel实际上被其他视图使用了......(对我来说部分可以,如果MVVM确实在Views和ViewModels之间规定了一个双射,那根本不可能?但这不是我的意思......)。
在我看来,我宁愿拥有一个DocumentModel.cs而不是DocumentViewModel.cs,它可以由多个ViewModel(InboxViewModel,EditDocumentViewModel ...)共享,并封装对WS的调用以触发业务操作服务器端与客户端修改的实体。 然后,我们将有一个应用逻辑模型或面向GUI的模型( M -V-VM),另外(以及以下,逐层说明)到ViewModels(MV- VM )和视图(M- V -VM)。所有在Silverlight方面。
然后是2个问题:
1-如果保留我的拙见,可以将ItemTemplate直接绑定到Model对象吗?由于没有一个视图直接绑定到DocumentModel,而是绑定到InboxViewModel(例如)中的一个属性,该属性是DocumentModel对象?
2-更一般地说,服务器端和客户端实现的业务逻辑是什么? 由于服务器旨在将WS暴露给其他(虚构的未来或未来的fictionnal:p)应用程序,我们是否真的希望将所有第一个应用程序业务逻辑放在服务器中,或者只通过WS公开原子操作并让所有应用程序实现他们正确的逻辑呢?
我的技术主管让我充满了参考资料,但他/他没有给我任何答案,而且,我只是想在我自己这里思考。
感谢你们所有人...... 干杯
答案 0 :(得分:1)
我认为你正在触及MVVM的各个方面,A)提出最多的问题,B)达成最少的共识。
模式意味着三层:模型是数据,视图是屏幕,ViewModel位于它们之间。我开始认为这是不准确的,或者至少是非最佳的。从数据到屏幕,这是我正在努力的方向:
A)服务层:此代码可以是ADO.NET调用的实际服务或包装器。无论风味如何,它的工作都是与物理数据源进行交互。它使用实体(不一定是EF类,只是代表数据库的类)来实现这一点。
B)实体层:这些是服务层获得的类。所有与物理数据源之间的通信都是通过这些实体类进行的。
C)数据模型层:这些类包装/管理实体层。具体来说,它们实现了INotifyPropertyChanged,以便稍后可以在View中使用它们并公开用于访问Entity层的方法和属性。此抽象允许更改和更新实体层,而不会对ViewModel或View产生负面影响。
D)ViewModel层:ViewModel类,它也实现了INotifyPropertyChanged,管理View和Data Model类之间的交互。命令和特定的可视属性格式(比如将FirstName和LastName组合成FullName属性)出现在此层。 ViewModel可以进一步抽象数据模型类,但此时它没有必要。
E)视图层:最终视图(Window,Page或UserControl)。我的硬性规则是为每个View关系维护一个ViewModel(反之亦然)。
我正在调用这些图层,因为这是合乎逻辑的想法:它们的物理实现方式将取决于您的情况。
FWIW,我最近一直在教MVVM并巩固我对架构的看法。我在教授它时首先要说的是,实现MVVM的方法与实现MVVM的人一样多。虽然这显然有点夸张,但这个想法表明你必须找到最适合你和你的情况。