WPF客户端开发:WCF通信与NHibernate持久化

在本系列文章中,将探讨如何构建一个WPF客户端应用程序,该程序使用WCF进行通信,并使用NHibernate进行数据持久化。本文将从高层次上介绍架构解决方案的范围,并讨论文章的总体内容。

章节概览

在上一章中,介绍了Relay Command,并展示了XAML中的视图如何使用绑定轻松调用服务方法。还发现了一个在调用客户服务方法时,ViewModel没有通知视图模型更新的问题。在本章中,将讨论一个模式,该模式利用模型更改通知视图。

本章的源代码可以在CodePlex变更集93477中找到。eDirectory解决方案的最新代码可以在CodePlex上找到。

ServiceAdapter和CommandDispatch重构

在第七章中对ServiceAdapter和CommandDispatch进行重构后,进行了以下更改:

INotifyPropertyChanged接口:INotifyPropertyChanged接口可以由XAML DataContext实例使用,以通知XAML视图模型中的属性已更改。接口非常简单;它只暴露了一个名为"PropertyChanged"的事件,视图订阅此事件,以便在事件触发时得到通知。如果检查事件处理程序,将看到它需要一个对象,在案例中是ViewModel,以及已更改的属性名称,这作为字符串传递。

可以在每个ViewModel类中实现这个接口,但更好的方法是提供一个包含此功能的基类和通用实现,以便可以轻松重用。

ViewModelBase

ViewModelBase抽象类实现了INotifyPropertyChanged,为ViewModel类提供了一个简单的机制,以指示模型属性何时更改。ViewModel在ViewModel构造函数中被分配为视图的DataContext,如下代码片段中第01行所示。

public CustomerViewModel() { CustomerServiceAdapter = new ServiceAdapter<ICustomerService>(); Refresh(); View = new CustomerView { DataContext = this }; View.ShowDialog(); }

有人指出ViewModel不应该了解视图,如果严格遵循MVVM模式,这可能是正确的。隔离ViewModel和视图的主要驱动因素是测试目的。可能希望看看其他人已经就这个话题说了什么:

Thread by mtaboy: why in your ViewModels you have a reference from its view. Thread by stl7 re-coupling Views and ViewModels.

在MVVM Light Toolkit中,Messenger组件的一个用途正是为了解耦ViewModel和视图。它需要更多的基础设施,但它解决了耦合问题时的大多数问题。

INotifyPropertyChanged的实现

只需对CustomerViewModel进行微小的更改,就可以使其与新的抽象类一起工作;用两行代码,应用程序就可以工作了。

public class CustomerViewModel : ViewModelBase { private void Refresh() { var result = CustomerServiceAdapter.Execute(s => s.FindAll()); Model = new CustomerModel { NewCustomerOperation = new CustomerDto(), CustomerList = result.Customers}; RaisePropertyChanged(() => Model); } }

第一个更改是CustomerViewModel现在继承自ViewModelBase(第01行),简单。另一个更改是想要通知视图模型已更改时;这发生在Refresh方法中调用FindAll方法时。第02行指示如何实现这一点,使用Lambda表达式指示ViewModel的哪个属性已更新,在例子中是Model。这是视图需要刷新的唯一内容。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485