使用WCF和NHibernate开发WPF客户端

在本系列文章中,将探讨如何开发一个Metro风格的应用程序,名为Sharpy。这个应用程序将使用WCF进行服务端通信,并使用NHibernate进行数据持久化。本文将介绍整个系列文章的范围,并在高层次上讨论架构解决方案。

Sharpy - 一个Metro项目

10月23日:目前正在为一个Metro应用程序开发一个新的项目:Sharpy。打算在应用程序的服务端使用WCFby Example中讨论的模式;目标是展示Metro应用程序的开发与迄今为止看到的应用程序类型有多相似。目前还没有代码可用,但希望这种情况很快就会改变。希望会喜欢它。

文章概述

在前面的章节中,已经讨论了核心服务器组件的设计和实现。现在,准备设置一个客户端来与服务器端的服务和业务逻辑进行交互。

正如在系列文章开始时所指出的,富客户端基于WPF,并使用MVVM模式。假设读者熟悉WPF和MVVM的基本概念。

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

开始之前

在设计富客户端时,使用的主要原则是模型应该包含尽可能多的信息,并使用XAML绑定功能,因此在视图中创建的代码非常少。ViewModel将负责创建视图和检索模型实例,这些实例直接绑定到视图。

由于这种方法,设计广泛使用了操作模式(RelayCommand)在模型上调用ViewModel中定义的方法,在视图中,依赖属性在XAML中用作扩展模型和视图之间绑定功能的方法。转换器在这种方法中对命令执行也很有用。在后续章节中,将演示ViewModel中INotifyPropertyChange模式的使用,以便模型和视图可以在绑定属性更改时相互通知。

WPF客户端项目

本章介绍了eDirectory解决方案中的一个新项目:eDirectory.WPF。本章中的WPF项目由一个屏幕组成,允许用户创建和查看客户实体。遵循MVVM模式,为客户文件夹下的视图(XAML)、模型(DTOs)和ViewModel创建了三个文件。

模型非常简单,只是重用了在公共程序集中已经定义的DTO。这样,从服务中检索数据并轻松重用就变得非常简单。

public class CustomerModel { public CustomerDto NewCustomerOperation { get; set; } public IList<CustomerDto> CustomerList { get; set; } }

以下是XAML类的摘录:

<Window x:Class="eDirectory.WPF.Customer.View.CustomerView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit" Title="Customer View" Height="400" Width="400" WindowStartupLocation="CenterScreen"> <Grid Name="MainLayout"> ... <GroupBox Header="New Customer" Margin="5" Padding="5" Grid.Row="0"> <Grid Name="NewCustomer"> ... <Label Grid.Column="0" Grid.Row="0"> First Name </Label> <TextBox Grid.Column="0" Grid.Row="1" Text="{Binding Path=Model.NewCustomerOperation.FirstName, Mode=TwoWay}"> </TextBox> ... </Grid> </GroupBox> <GroupBox Header="List of Customers" Margin="5" Padding="5" Grid.Row="1"> <Grid Name="ListOfCustomers"> ... <tk:DataGrid Grid.Row="0" ... ItemsSource="{Binding Path=Model.CustomerList}"> <tk:DataGrid.Columns> <tk:DataGridTextColumn Header="Customer Id" Binding="{Binding Path=CustomerId, Mode=OneWay}" /> ... </tk:DataGrid.Columns> </tk:DataGrid> ... </Grid> </GroupBox> ... </Grid> </Window>

ViewModel的责任是创建视图的实例并使用调用服务器服务来检索模型。此时,ViewModel的实现非常简单:

public class CustomerViewModel { private readonly CustomerView View; public CustomerViewModel() { View = new CustomerView(); View.DataContext = this; View.ShowDialog(); } public CustomerModel Model { get; set; } }

BootStrapper

在传统的WPF应用程序中,视图被设置为启动对象,在应用程序中情况并非如此。需要更多的灵活性,所以将在App.xaml.cs文件中创建一个BootStrapper方法,该方法创建一个专门的BootStrapper类的实例,然后创建CustomerViewModel的实例。

public partial class App : Application { private void BootStrapper(object sender, StartupEventArgs e) { var boot = new eDirectoryBootStrapper(); boot.Run(); new CustomerViewModel(); } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485