Silverlight 的 Dataset 代理
Silverlight 的 Dataset 代理
引言
我最近在一个项目中工作,所有实体都在客户端和服务器之间以数据集的形式传输。突然有人提出了一个想法,我们可以编写一个只读的 Silverlight 客户端。
所以我花了一些时间在互联网上寻找解决方案。但没有人找到任何解决方案。因此,我开始了这项小项目。目前,它只是从服务器到客户端的单向通信。但我认为应该很容易扩展解决方案,将数据从 Silverlight 传回一个(无类型)数据集。
Using the Code
这是一个我的 WCF 服务的示例。我有一个方法 GetDataset
,它返回一个 ExampleDataSet
。我向服务类添加了一个名为 [DataSetSerializableTypes]
的代理属性,它能够将 dataset
转换为 Silverlight 可以使用的 dataobject
。这适用于所有类型化和无类型化数据集。
//This surrogate is converting the dataset to an dataobject
//that can be consumed in Silverlight
[DataSetSerializableTypes]
public class DatasetService
{
[OperationContract]
public ExampleDataSet GetDataset()
{
ExampleDataSet ds = new ExampleDataSet();
ExampleDataSet.AnimalRow aRow = ds.Animal.NewAnimalRow();
aRow.Id = Guid.NewGuid();
aRow.Name = "Monkey";
ds.Animal.AddAnimalRow(aRow);
ExampleDataSet.FoodRow fRow = ds.Food.NewFoodRow();
fRow.Id = Guid.NewGuid();
fRow.Name = "Banana";
fRow.Amount = 25;
ds.Food.AddFoodRow(fRow);
return ds;
}
}
你唯一需要注意的就是删除数据集中的命名空间。否则,此解决方案将无法工作。

背景
第一步 - 数据合同代理
我发现 WCF 有一个强大的机制来改变在服务和客户端之间发送的所有内容的序列化方式。
首先你需要实现 DataSetSerializableTypesAttribute
接口。这是用于告诉 WCF 服务你想为某种类型覆盖默认序列化的属性。然后你需要第二个接口,名为 IdataContractSurrogate
,它实际上执行从 dataset
到 dataobject
的转换工作。
http://msdn.microsoft.com/en-us/library/ms733064.aspx
第二步 - 运行时类型生成
在 .NET 中,你可以编写能够运行时生成新类型的汇编程序代码。这种机制非常强大。在互联网上,我找到了一些关于如何创建类构建器的想法。
http://silverlight.net/forums/p/16733/59115.aspx#59115
我稍微修改了这段代码,现在这段代码能够将整个 dataset
转换为 dataobjects
集合。
第三步 - Silverlight 代理
主要思想是,当 Visual Studio 读取 WCF 元数据时,它只会看到 dataobject
,并且 Silverlight 代理将自动正确生成。你甚至可以更改 dataset
,你只需要更新服务引用即可。

历史
这是一个实验性的解决方案,但它允许你将 dataset
作为 dataobject
在 Silverlight 中使用。玩得开心!