silverlight:学Silverlight 2系列(17):数据和通信的ADO.NET Data Services

  本文举例源代码或素材下载

  概述  Silverlight 2 Beta 1版本发布了无论从Runtime还是Tools都给我们带来了很多惊喜如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython对JSON、Web Service、WCF以及Sockets支持等系列新特性步学Silverlight 2系列文章将从Silverlight 2基础知识、数据和通信、自定义Control控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发

  本文将简单介绍在Silverlight 2中如何ADO.NET Data Services

  准备知识  由于ADO.NET Data Services是在ASP.NET 3.5 Extensions中所以在开始本文举例的前首先要安装下ASP.NET 3.5 Extensions最新版本你可以从这里下载安装完成后在添加新项对话框中应该能够看到ADO.NET Data Service项:

学Silverlight 2系列(17):数据和通信的ADO.NET Data Services

  ADO.NET Data Service允许应用把数据以服务形式公开这样我们就可以通过浏览器来直接访问数据它支持开放业界标准如AtomPub和JSON它支持标准HTTP动作如POST、GET、PUT、DELETE用来完成数据创建、更新、删除和读取ADO.NET Data Service知识这里不再多说大家可以去查看相关资料

  简单举例  如果大家看了前面 3篇文章可能对于下面这个界面已经很烦了不过在本文我会仍然采用这个举例进行演示:)

学Silverlight 2系列(17):数据和通信的ADO.NET Data Services

  建立完Silverlight 2项目的后我们在Web项目中添加个Post类:

public Post
{
  public Id { get; ; }
  public Title { get; ; }
  public Author { get; ; }
}
  我们用Id作为Post主键这里需要添加对于Microsoft.Data.Web.dll引用位于<盘符>Program FilesReference AssembliesMicrosoftFrameworkASP.NET 3.5 Extensions下面引入命名空间using Microsoft.Data.Web并且为Id加上[DataWebKey]特性最终完成后代码应该如下:

public Post
{
  [DataWebKey]
  public Id { get; ; }
  public Title { get; ; }
  public Author { get; ; }
}
  再添加个Blog类它有个返回类型为IQueryable<Post>属性Posts:

public Blog
{
  public Blog
  {
    _post.Add( Post { Id = 1, Title = "步学Silverlight 2系列(13):数据和通信的WebRequest", Author = "TerryLee" });
    _post.Add( Post { Id = 2, Title = "步学Silverlight 2系列(12):数据和通信的WebClient", Author = "TerryLee" });
    _post.Add( Post { Id = 3, Title = "步学Silverlight 2系列(11):数据绑定", Author = "TerryLee" });
    _post.Add( Post { Id = 4, Title = "步学Silverlight 2系列(10):使用用户Control控件", Author = "TerryLee" });
    _post.Add( Post { Id = 5, Title = "步学Silverlight 2系列(9):使用Control控件模板", Author = "TerryLee" });
    _post.Add( Post { Id = 6, Title = "步学Silverlight 2系列(8):使用样式封装Control控件观感", Author = "TerryLee" });
  }
  List<Post> _post = List<Post>;
  public IQueryable<Post> Posts
  {
    get { _post.AsQueryable<Post>; }
  }
}
  添加个ADO.NET Data Service取名BlogDataService.svc:

学Silverlight 2系列(17):数据和通信的ADO.NET Data Services

  实现服务让它继承于泛型WebDataService并且设置访问权限

public BlogDataService : WebDataService<Blog>
{
  public void InitializeService(IWebDataServiceConfiguration config)
  {
    config.SetResourceContainerAccessRule("*", ResourceContainerRights.AllRead);
  }
}
  现在我们服务端就完成了现在我们可以在浏览器中访问BlogDataService.svc应该可以看到如下界面:

学Silverlight 2系列(17):数据和通信的ADO.NET Data Services

  现在还看不到所有Posts我们可以在地址栏中输入http://localhost:8081/BlogDataService.svc/Posts浏览器会默认为Feed打开可以查看源代码将会看到所有内容XML内容如下(只列出片段):

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://localhost:8081/BlogDataService.svc/" ......>
 <id>http://localhost:8081/BlogDataService.svc/Posts</id>
 <updated />
 <title>Posts</title>
 <link rel="self" href="Posts" title="Posts" />
 <entry adsm:type="TerryLee.SilverlightWithDataServiceDemoWeb.Post">
  <id>http://localhost:8081/BlogDataService.svc/Posts(1)</id>
  <updated />
  <title />
  <author>
   <name />
  </author>
  <link rel="edit" href="Posts(1)" title="Post" />
  <content type="application/xml">
   <ads:Id adsm:type="Int32">1</ads:Id>
   <ads:Title>步学Silverlight 2系列(13):数据和通信的WebRequest</ads:Title>
   <ads:Author>TerryLee</ads:Author>
  </content>
 </entry>
  如果要查看某条文章内容可以输入http://localhost:8081/BlogDataService.svc/Posts(2)进行查看如下图所示

学Silverlight 2系列(17):数据和通信的ADO.NET Data Services

  当然还可以进行其他查询使用filter和orderby等如http://localhost:8081/BlogDataService.svc/Posts?$filter=Id eq 1&$orderby=Id这里不在介绍至此我们数据服务端就算完成了下面再实现客户端XAML不再贴出来大家可以参考前面几篇文章使用WebClient获取数据返回结果是个XML文件:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
  Uri uri = Uri("http://localhost:8081/BlogDataService.svc/Posts");
  WebClient client = WebClient;
  client.OpenReadCompleted OpenReadCompletedEventHandler(client_OpenReadCompleted);
  client.OpenReadAsync(uri);
}
void client_OpenReadCompleted(object sender,OpenReadCompletedEventArgs e)
{
   (e.Error null)
  {
    
  }
}
  我们可以使用LINQ to XML进行数据读取在Silverlight项目中建立个Post类跟上面Post类然后使用LINQ to XML读取:

XmlReader reader = XmlReader.Create(e.Result);
XDocument postdoc = XDocument.Load(reader);
XNamespace xmlns = "http://www.w3.org/2005/Atom";
XNamespace ads = "http://schemas.microsoft.com/ado/2007/08/dataweb";
var posts = from x in postdoc.Descendants(xmlns + "entry")
      select Post
      {
        Id = .Parse(x.Descendants(ads + "Id").First.Value),
        Title = x.Descendants(ads + "Title").First.Value,
        Author = x.Descendants(ads + "Author").First.Value
      };
Posts.ItemsSource = posts;
  完成代码如下所示:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
  Uri uri = Uri("http://localhost:8081/BlogDataService.svc/Posts");
  WebClient client = WebClient;
  client.OpenReadCompleted OpenReadCompletedEventHandler(client_OpenReadCompleted);
  client.OpenReadAsync(uri);
}
void client_OpenReadCompleted(object sender,OpenReadCompletedEventArgs e)
{
   (e.Error null)
  {
    XmlReader reader = XmlReader.Create(e.Result);
    XDocument postdoc = XDocument.Load(reader);
    XNamespace xmlns = "http://www.w3.org/2005/Atom";
    XNamespace ads = "http://schemas.microsoft.com/ado/2007/08/dataweb";
    var posts = from x in postdoc.Descendants(xmlns + "entry")
          select Post
          {
            Id = .Parse(x.Descendants(ads + "Id").First.Value),
            Title = x.Descendants(ads + "Title").First.Value,
            Author = x.Descendants(ads + "Author").First.Value
          };
    Posts.ItemsSource = posts;
  }
}
  完整举例就到这里了运行后结果和前面

学Silverlight 2系列(17):数据和通信的ADO.NET Data Services



  结束语  本文简单介绍了在Silverlight 2ADO.NET Data Services由于对ADO.NET Data Services了解不多地方还请大家斧正你可以下载举例代码



Tags:  silverlight2 silverlight.2.0 silverlight是什么 silverlight

延伸阅读

最新评论

发表评论