创建 RIA Services 解决方案

WCF RIA Services
 
4(共 7)对本文的评价是有帮助 评价此主题
 

在本演练中,您将创建一个 WCF RIA Services 应用程序,该应用程序从 AdventureWorksLT 数据库检索数据,然后将数据提供给呈现它们的 Silverlight 客户端。您要通过创建实体类(它们表示中间层的服务器上的各种数据库表)访问数据,然后通过创建域服务(它使 Silverlight 客户端能够访问这些中间层实体)来呈现这些数据。本演练可作为 RIA Services 文档中的许多其他演练的起点。

设置 RIA Services 解决方案

  1. 通过依次选择“文件”“新建”“项目”,在 Visual Studio 2010 中创建新的 RIA Services 项目。

    此时将出现“新建项目”对话框。

  2. “已安装的模板”“Silverlight”组中选择“Silverlight 应用程序”模板,然后将新项目命名为 RIAServicesExample

    RIA_StartProject
  3. 单击“确定”

    此时将出现“新建 Silverlight 应用程序”对话框。

  4. 选中对话框底部附近的“启用 WCF RIA Services”复选框。选中此复选框可在客户端项目和服务器项目之间创建 RIA Services 链接。

    RIA_CreateProjectwithLink
  5. 单击“确定”创建解决方案。

    该解决方案包含两个项目:一个客户端项目和一个服务器项目。客户端项目名为 RIAServicesExample,它包含用于创建表示层的 Silverlight 代码。服务器项目名为 RIAServicesExample.Web,它包含中间层代码。

    RIA_ProjectsCreated

在本节中,您将创建表示 AdventureWorksLT 数据库中的数据的 ADO.NET 实体类。RIA Services 适用于各种数据建模类和数据源。有关使用 RIA Services 访问数据的选项的更多信息,请参见数据主题。

Caution警告:
在将实体数据模型 (EMD) 与 Visual Studio 2010 一起使用时,必须选择“在模型中加入外键列”选项。默认情况下,在使用“实体数据模型”向导时将选择此选项。您还必须使用在程序集中嵌入 EMD 映射信息的默认行为。

 

 

使数据在中间层上可用

  1. “解决方案资源管理器”中,右击服务器项目 (RIAServicesExample.Web),选择“添加”,然后选择“新建项”

    此时将出现“添加新项”对话框。

  2. 在类别列表中,选择“数据”,然后选择“ADO.NET 实体数据模型”模板。

  3. 将新文件命名为 AdventureWorksModel.edmx,并单击“添加”

    此时将出现“实体数据模型向导”

  4. “选择模型内容”屏幕上,选择“从数据库生成”选项,然后单击“下一步”

  5. “选择您的数据连接”屏幕上,创建与数据库的数据连接,然后单击“下一步”

  6. “选择数据库对象”屏幕上,依次选择“Address”“Customer”“CustomerAddress”表。

  7. 确认“在模型中加入外键列”复选框已默认选中,然后单击“完成”

    这将为表创建实体模型。

  8. 生成(使用组合键 Ctrl+Shift+B)该解决方案。

在本节中,您将向中间层项目添加域服务。域服务将向客户端项目公开服务器项目中的数据实体和操作。可以将业务逻辑添加到域服务以管理客户端与数据交互的方式。

创建域服务

  1. 右击服务器项目,依次选择“添加”“新建项”

  2. 在类别列表中,选择“Web”,然后选择“域服务类”模板。

  3. 将类命名为 CustomerDomainService.cs(或 CustomerDomainService.vb)。

    RIA_AddDomainService
  4. 单击“添加”

    此时将出现“添加新的域服务类”对话框。

  5. 确保选中“启用客户端访问”框。

  6. 选择“Customer”实体,然后为它选中“启用编辑”框。

    RIA_AddEntity
  7. 单击“确定”

    这将在新的 CustomerDomainService.cs(或 CustomerDomainService.vb)文件中生成 CustomerDomainService 类。

  8. 打开此文件。请注意,此文件具有以下特征:

    • CustomerDomainService 类派生自 LinqToEntitiesDomainService 类,后者是 RIA Services 框架中的抽象基类。此基类将自动使用,因为域服务会公开一个 ADO.NET 实体数据类。

    • 泛型基类会绑定到在前面的步骤中由 ObjectContext 类型的 AdventureWorksLTEntities 在其泛型参数中创建的实体类。

    • CustomerDomainService 类是用 EnableClientAccessAttribute 特性标记的,以指示它对客户端层可见。

    • 将生成名为 GetCustomers 的查询方法。此方法将在不进行任何筛选或排序的情况下返回每个项目。

    • 已生成用于从记录插入、更新和删除客户的方法。

在其他演练中,将为您演示如何向域服务添加业务逻辑。在本演练中,您将只使用默认情况下生成的 GetCustomers 方法。

在生成解决方案时将生成客户端代理类。利用客户端项目和服务器项目之间建立的 RIA Services 链接,可以生成此代码。这些客户端代理类将提供对客户端中的数据的访问。

查看生成的客户端代理类

  1. 生成解决方案。

    生成解决方案时,将在客户端项目中生成代码。

  2. “解决方案资源管理器”中,选择“RIAServicesExample”客户端项目,然后单击窗口顶部的“显示所有文件”图标。

    请注意,Generated_Code 文件夹包含 RIAServicesExample.Web.g.cs(或 RIAServicesExample.Web.g.vb)文件。

    RIA_GeneratedCode
  3. 在 Generated_Code 文件夹中打开代码文件。

    请注意,此文件具有以下特征:

    • 将生成派生自 WebContextBase 类的 WebContext 类。

    • 将生成派生自 DomainContext 类的 CustomerDomainContext 类。此类具有一个名为 GetCustomersQuery 的方法,该方法对应于域服务中创建的查询方法。

    • 将为域服务所公开的实体生成派生自 Entity 类的 Customer 类。客户端项目中的 Customer 实体类将匹配服务器上的 Customer 实体。

在 Silverlight 客户端中显示数据

  1. 打开 MainPage.xaml。

  2. 从左侧的“工具箱”中,将 DataGrid 控件拖动到 XAML 视图中的 Grid 元素内。

    “工具箱”拖动“DataGrid”控件将导致自动添加命名空间 using System.Windows.Controls 语句和对 System.Windows.Controls.Data 程序集的引用。

    Caution警告:
    如果添加 DataGrid 而不从“工具箱”拖动它,则必须将对 System.Windows.Controls.Data 程序集的引用添加到客户端项目,并手动将 using 语句添加到代码隐藏文件中。

     

     

  3. 将 AutoGeneratedColums 的值更改为 True,将 DataGrid 元素命名为 CustomerGrid,并调整高度和宽度特性,如下面的 XAML 所示。

     
    <UserControl 
        xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  
        x:Class="RIAServicesExample.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
    
        <Grid x:Name="LayoutRoot" Background="White">
          <data:DataGrid Name="CustomerGrid"></data:DataGrid>
        </Grid>
    </UserControl>
    
    
  4. 打开 MainPage.xaml 的代码隐藏文件。

  5. 向 using (C#) 或 Imports (Visual Basic) 添加两个语句:using RIAServicesExample.Web; 和 using System.ServiceModel.DomainServices.Client;

    RIAServicesExample.Web 命名空间是一个包含为 RIAServicesExample.Web.g.cs(或 RIAServicesExample.Web.g.vb)中的客户端项目生成的代码的命名空间。

  6. 若要实例化 CustomerDomainContext,请在 MainPage 类中添加代码行 private CustomerDomainContext _customerContext = new CustomerDomainContext();

     
    Imports System.ServiceModel.DomainServices.Client
    Imports RIAServicesExample.Web
    
    Partial Public Class MainPage
        Inherits UserControl
    
        Private _customerContext As New CustomerDomainContext
    
        Public Sub New()
            InitializeComponent()
    
            Dim loadOp = Me._customerContext.Load(Me._customerContext.GetCustomersQuery())
            CustomerGrid.ItemsSource = loadOp.Entities
        End Sub
    
    End Class
    
    
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using RIAServicesExample.Web;
    using System.ServiceModel.DomainServices.Client;
    
    namespace RIAServicesExample
    {
        public partial class MainPage : UserControl
        {
            private CustomerDomainContext _customerContext = new CustomerDomainContext();
    
            public MainPage()
            {
                InitializeComponent();
    
                LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery());
                CustomerGrid.ItemsSource = loadOp.Entities;
            }
        }
    }
    
    
  7. 通过使用 LoadOperation 调用 GetCustomersQuery 方法来检索客户实体:LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery());

  8. 使用 CustomerGrid.ItemsSource = loadOp.Entities; 将加载的实体绑定到 DataGrid

    总之,MainPage.xaml.cs 文件此时应包含以下代码:

     
     
    //Namespaces added
    using RIAServicesExample.Web;
    using System.ServiceModel.DomainServices.Client;
    
    
    namespace RIAServicesExample
    {
        public partial class MainPage : UserControl
        {
            private CustomerDomainContext _customerContext = new CustomerDomainContext();
            public MainPage()
            {
                InitializeComponent();
    
                LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery());
                CustomerGrid.ItemsSource = loadOp.Entities;
            }
        }
    }
    
    
  9. 运行 (F5) 该应用程序。

    您应看到与下面类似的数据网格。

    RIA_ResultsGrid

本演练只演示从域服务创建项目和检索未筛选数据的基本步骤。以下是为便于您了解其他功能提出的一些建议:

  • 创建自定义查询方法(例如,接受参数的查询),这些查询方法通常用于筛选数据。有关更多信息,请参见演练:添加查询方法

  • 向包含更新、插入和删除方法且管理数据修改过程的域服务添加业务逻辑。有关更多信息,请参见如何:向域服务添加业务逻辑

posted on 2014-01-09 16:17  aabcdee  阅读(224)  评论(0编辑  收藏  举报

导航