使用WCFRIA服务从服务器公开数据
立即解锁
发布时间: 2025-08-26 00:48:24 阅读量: 6 订阅数: 20 


Silverlight 4商业应用开发指南
### 使用 WCF RIA 服务从服务器公开数据
在开发中,从服务器向客户端公开数据是一个常见的需求。传统上,使用 DataSet 从 Web 服务返回数据是一种常见做法,但现在这种方式被认为是不良实践,因为它存在诸多问题,而且 Silverlight 也不支持 DataSet。如今,许多开发者转向使用轻量级、强类型的 DTO 来公开数据。
#### 1. 创建表示模型类
首先,我们需要创建一个标准类,该类仅包含需要在客户端和服务器之间传输的属性。与实体框架中的实体示例类似,我们可以使用验证规则属性等装饰这个类(可以直接装饰或使用元数据类)。需要注意的是,必须使用 `Key` 属性装饰一个或多个属性,以表明该属性的值唯一标识对象,否则会出现编译错误,因为客户端的变更集管理器没有它就无法管理变更。
以下是一个名为 `ProductPM` 的表示模型类的代码示例:
```csharp
public partial class ProductPM
{
[Key]
[Editable(false)]
public int ProductID { get; set; }
public string Name { get; set; }
public string ProductNumber { get; set; }
public decimal ListPrice { get; set; }
public DateTime ModifiedDate { get; set; }
}
```
#### 2. 填充和公开表示模型类型
接下来,我们需要创建一个域服务,以便客户端可以检索这些对象的集合,并在适当的时候更新、插入或删除集合中的对象。由于域服务类向导仅在使用实体框架实体或 LINQ to SQL 模型对象时生成 CRUD 操作,因此我们需要手动创建域服务。
具体操作步骤如下:
1. 在项目的 `Services` 文件夹中添加一个新项,使用“域服务类”项模板,命名为 `ProductPMService`。
2. 在“域服务类向导”对话框的“可用数据上下文/对象上下文”下拉列表中选择 `<空的域服务类>`,这将创建一个空的域服务,我们可以向其中添加所需的操作。
以下是域服务的代码示例:
```csharp
[EnableClientAccess()]
public class ProductPMService : DomainService
{
private AdventureWorks2008Entities context = new AdventureWorks2008Entities();
public IQueryable<ProductPM> GetProducts()
{
return from p in context.Products
select new ProductPM()
{
ProductID = p.ProductID,
Name = p.Name,
ProductNumber = p.ProductNumber,
ListPrice = p.ListPrice,
ModifiedDate = p.ModifiedDate
};
}
}
```
当执行这个查询操作时,它将填充并返回一个表示模型对象 `ProductPM` 的集合到客户端。
#### 3. 更新表示模型类型
我们还可以实现插入、更新和删除操作,通过将 `ProductPM` 对象作为参数传递给每个操作,并相应地手动更新实体框架模型。
以下是插入操作的代码示例:
```csharp
public void InsertProduct(ProductPM productPM)
{
Product product = new Product();
product.Name = productPM.Name;
product.ProductNumber = productPM.ProductNumber;
product.ListPrice = productPM.ListPrice;
product.ModifiedDate = DateTime.Now;
context.Products.AddObject(product);
context.SaveChanges();
ChangeSet.Associate(productPM, product, UpdateProductPMKeys);
}
private void UpdateProductPMKeys(ProductPM productPM, Product product)
{
productPM.ProductID = product.ProductID;
}
```
#### 4. 跨层共享代码/逻辑
有时,我们可能希望在中间层和表示层之间共享自定义代码,例如自定义验证逻辑和某些类型的业务逻辑。RIA 服务代码生成器通过自动将服务器项目中扩展名为 `.shared.cs` 的文件复制到客户端项目中,从而实现了这一点。
以下是一个扩展 `Product` 实体添加计算属性 `ProfitMargin` 的示例:
```csharp
namespace AdventureWorks.Web
{
public partial class Product
{
public decimal ProfitMargin
```
0
0
复制全文
相关推荐










