文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Silverlight via WCF RIA Service 1:快速入门及测试框架

Silverlight via WCF RIA Service 1:快速入门及测试框架

时间:2011-06-10  来源:陆敏技

本文目的是通过Silverlight ria service完成一次数据的读取过程,并且在此基础上建立打架测试项目。

Ria service借助于WCF和ADO.NET Entity Framework构建分布式开发框架。使用它可以快速构建自己的开发模式。

1:基础结构

首先,创建SL APP,如下:

然后,选择创建web:

可以,也可以不勾选enable wcf ria service,如果勾选了,在SL APP中会多几个DLL的引用,其它没有任何差别。如图:

2:创建一个示例数据库

这是一个小而轻型的数据库,不要小看它,它是《SQL COOKBOOK》的示例数据库。如下:

CREATE TABLE emp
    (
      EMPNO INT NOT NULL ,
      ENAME VARCHAR(32) DEFAULT NULL ,
      JOB VARCHAR(32) DEFAULT NULL ,
      MGR VARCHAR(32) DEFAULT NULL ,
      HIREDATE DATETIME DEFAULT NULL ,
      SAL int DEFAULT NULL ,
      COMM VARCHAR(16) DEFAULT NULL ,
      DEPTNO VARCHAR(8) DEFAULT NULL ,
      PRIMARY KEY ( EMPNO )
    ) 
 
--
 
-- Dumping data for table emp
 
--
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7369 ,
          'SMITH' ,
          'CLERK' ,
          '7902' ,
          '1980-12-17' ,
          '800' ,
          NULL ,
          '20'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7499 ,
          'ALLEN' ,
          'SALESMAN' ,
          '7698' ,
          '1981-02-20' ,
          '1600' ,
          '300' ,
          '30'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7521 ,
          'WARD' ,
          'SALESMAN' ,
          '7698' ,
          '1981-02-22' ,
          '1250' ,
          '500' ,
          '30'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7566 ,
          'JONES' ,
          'MANAGER' ,
          '7839' ,
          '1981-04-02' ,
          '2975' ,
          NULL ,
          '20'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7654 ,
          'MARTIN' ,
          'SALESMAN' ,
          '7698' ,
          '1981-09-28' ,
          '1250' ,
          '1400' ,
          '30'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7698 ,
          'BLAKE' ,
          'MANAGER' ,
          '7839' ,
          '1981-05-01' ,
          '2850' ,
          NULL ,
          '30'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7782 ,
          'CLARK' ,
          'MANAGER' ,
          '7839' ,
          '1981-06-09' ,
          '2450' ,
          NULL ,
          '10'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7788 ,
          'SCOTT' ,
          'ANALYST' ,
          '7566' ,
          '1982-12-09' ,
          '3000' ,
          NULL ,
          '20'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7839 ,
          'KING' ,
          'PRESIDENT' ,
          NULL ,
          '1981-11-17' ,
          '5000' ,
          NULL ,
          '10'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7844 ,
          'TURNER' ,
          'SALESMAN' ,
          '7698' ,
          '1981-09-08' ,
          '1500' ,
          '0' ,
          '30'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7876 ,
          'ADAMS' ,
          'CLERK' ,
          '7788' ,
          '1983-01-12' ,
          '1100' ,
          NULL ,
          '20'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7900 ,
          'JAMES' ,
          'CLERK' ,
          '7698' ,
          '1981-12-03' ,
          '950' ,
          NULL ,
          '30'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7902 ,
          'FORD' ,
          'ANALYST' ,
          '7566' ,
          '1981-12-03' ,
          '3000' ,
          NULL ,
          '20'
 
        )
 
INSERT  INTO emp
        ( EMPNO ,
          ENAME ,
          JOB ,
          MGR ,
          HIREDATE ,
          SAL ,
          COMM ,
          DEPTNO
 
        )
VALUES  ( 7934 ,
          'MILLER' ,
          'CLERK' ,
          '7782' ,
          '1982-01-23' ,
          '1300' ,
          NULL ,
          '10'
 
        )
 
--
 
-- table dept
 
--
 
CREATE TABLE dept
    (
      DEPTNO INT NOT NULL ,
      DNAME VARCHAR(32) DEFAULT NULL ,
      LOC VARCHAR(32) DEFAULT NULL ,
      PRIMARY KEY ( DEPTNO )
    )
 
INSERT  INTO dept
        ( DEPTNO, DNAME, LOC )
VALUES  ( '10', 'ACCOUNTING', 'NEW YORK' )
 
INSERT  INTO dept
        ( DEPTNO, DNAME, LOC )
VALUES  ( '20', 'RESEARCH', 'DALLAS' )
 
INSERT  INTO dept
        ( DEPTNO, DNAME, LOC )
VALUES  ( '30', 'SALES', 'CHICAGO' )
 
INSERT  INTO dept
        ( DEPTNO, DNAME, LOC )
VALUES  ( '40', 'OPERATIONS', 'BOSTON' )
 
--
 
-- table t1
 
--
 
CREATE TABLE T1
    (
      ID INT NOT NULL ,
      PRIMARY KEY ( ID )
    ) 
 
INSERT  INTO t1
        ( ID )
VALUES  ( '1' )
 
--
 
-- table t10
 
--
 
CREATE TABLE T10
    (
      ID INT NOT NULL ,
      PRIMARY KEY ( ID )
    ) 
 
INSERT  INTO t10
        ( ID )
VALUES  ( '1' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '2' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '3' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '4' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '5' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '6' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '7' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '8' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '9' )
 
INSERT  INTO t10
        ( ID )
VALUES  ( '10' )
 
CREATE TABLE emp_bonus
    (
      empno INT ,
      received DATETIME ,
      TYPE INT
    )
go
INSERT  INTO emp_bonus
VALUES  ( 7934, 2005 - 5 - 17, 1 )
INSERT  INTO emp_bonus
VALUES  ( 7934, 2005 - 2 - 15, 2 )
INSERT  INTO emp_bonus
VALUES  ( 7839, 2005 - 2 - 15, 3 )
INSERT  INTO emp_bonus
VALUES  ( 7782, 2005 - 2 - 15, 1 )

3:RIA之ADO.NET ENTITY DATA MODEL

为web创建ADO.NET ENTITY DATA MODEL,如图:

注意,习惯命名规则:Model数据库名.edmx。在下一步中,我们选择“Generate from database”,如下:

在下一步中,我们选择刚才创建的数据库:

在下一步中,我们全选需要创建的数据对象,如红框所示:

点击Finish后,VS为我们生成了一个以edmx为后缀的文件。OK,到此暂停,我们先来看看这个edmx文件是干什么用的,为我们完成了什么工作。

3.1:什么是EDM

ENTITY DATA MODEL,简写为EDM,中文为实体数据模型。它由三个概念组成。概念模型由概念架构定义语言文件 (.csdl)来定义,映射由映射规范语言文件 (.msl),存储模型(又称逻辑模型)由存储架构定义语言文件 (.ssdl)来定义。这三者合在一起就是EDM模式。EDM模式在项目中的表现形式就是扩展名为.edmx的文件。

使用EDM,意味这我们使用的是ADO.NET Entity Framework来操作数据库,即:我们唯一能做的是操作EDM,EDM会将这个操作请求发往数据库。

Entity Framework实现了一套类似于ADO.NET2.0中连接类(它们使用方式相同,均基于Provider模式)的被称作EntityClient的类用来操作EDM。ADO.NET2.0的连接类是向数据库发送SQL命令操作表或视图,而EntityClient是向EDM发送EntitySQL操作Entity。EntityClient在EntityFramework中的作用是相当重要的,所有发往EDM的操作都是经过EntityClient,包括使用LINQ to Entity进行的操作。目前可用的操作EDM的方式如下:

4:针对web EMD的测试

理解了EMD在开发中所处的作用,我们就可以针对EDM来写个测试项目。为了简便期间,我们直接在EMD中的mysampleEntities类型的构造方法中直接创建测试(严格意义来说,这不是个单元测试,这仅是测试)。

针对这个操作,会在测试项目中生成一个mysampleEntitiesTest的类型,同时,在这个类型中会生成一个mysampleEntitiesConstructorTest的方法,如下:

由于我们仅仅测试EDM,而跟WEB本身没有关系,所有我们注释掉了红框中的内容。同时我们写入真正的测试代码,如下:

这里的一个小细节是,连接字符串我们通过编码的方式传入到测试方法。EDM的连接字符串和ADO.NET的连接字符串有很大不同,在这里,可公开一下我们的生成EDM连接字符串的方法:

        public string GetConnectionString()
        {
            string providerName = "System.Data.SqlClient";
            string serverName = "192.168.0.96";
            string databaseName = "mysample";
            SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
            sqlBuilder.DataSource = serverName;
            sqlBuilder.InitialCatalog = databaseName;
            sqlBuilder.IntegratedSecurity = false;
            sqlBuilder.UserID = "sa";
            sqlBuilder.Password = "sasa";
            string providerString = sqlBuilder.ToString();
            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.Provider = providerName;
            entityBuilder.ProviderConnectionString = providerString;
            entityBuilder.Provider = providerName;
            entityBuilder.Metadata = "res://*/Modelmysample.csdl|res://*/Modelmysample.ssdl|res://*/Modelmysample.msl";
            return entityBuilder.ToString();
        }

调试我们的测试代码,最终我们会获取到数据库中的14条记录。

通过了以上的阐述,我们了解了EDM的作用,以及如何测试EDM。接下来,我们需要知道如何在SL APP中调用WEB中的EDM。

5:Domain Service Class

在SL APP中调用EDM是通过WEB的Domain Service Class来实现的。简单的说来,它是RIA SERVICE框架中的一个重要内容。

在WEB选择添加新项,选择Domain Service Class,命名,下一步会出现如下界面:

我们可以做出如上勾选。确定后,编译整个解决方法,会发现目前的解决方案结构会变成如下形式:

注意,第一个红框部分,是VS自动为我们在SL APP生成的。它是第二个红框在客户端的对应版本。我们需要将它包含到项目中去。它包含了所有服务端版本类中定义的方法、实体等,而可在客户端直接调用。

6:Ria Service数据流转

好了,经过以上的描述我们知道了:

EDM:直接操作数据库;

Domain Service Class:调用EDM,并把数据接口通过WCF的形式开放给客户端;

SilverlightApplication4.Web.g.cs:调用Domain Service Class,完成对数据的读取,并最终呈现给UI;

7:最终展示

在SL APP中的UI调用呈现数据。前台:

后台,直接使用SilverlightApplication4.Web.g.cs中的DomainServiceMySample加载数据:

        public MainPage()
        {
            InitializeComponent();
            DomainServiceMySample context = new DomainServiceMySample();
            context.Load(context.GetEmpQuery());
            lb1.ItemsSource = context.emps;
        }

最后界面显示:

本示例源码下载:SilverlightApplication420110610.rar

参考:http://www.cnblogs.com/lsxqw2004/archive/2009/05/31/1495240.html

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载