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


Silverlight 4商业应用开发指南
### 使用WCF RIA服务从服务器公开数据
在开发应用程序时,我们常常需要从服务器获取数据并将其展示给客户端。WCF RIA服务提供了一种有效的方式来实现这一目标,它可以帮助我们更好地控制数据的传输和验证。下面将详细介绍如何使用WCF RIA服务从服务器公开数据。
#### 1. 元数据类
元数据类允许我们在不修改实体类本身的情况下,为实体添加属性。这在代码生成实体时非常有用,因为重新生成实体类时不会覆盖我们添加的属性。元数据类通过实体类上的属性与实体关联,通常的做法是为实体创建一个部分类,并将属性应用到该部分类上。
例如,打开为`Product`实体创建的元数据类(文件名通常为`<DomainServiceName>.metadata.cs`),可以看到如下结构:
```csharp
[MetadataTypeAttribute(typeof(Product.ProductMetadata))]
public partial class Product
{
internal sealed class ProductMetadata
{
// Field definitions (removed for the purposes of brevity)
}
}
```
这里的`MetadataTypeAttribute`将`Product`实体与`ProductMetadata`元数据类关联起来。虽然默认情况下元数据类是嵌套类,但也可以使用其他可引用的类。我们可以将元数据类视为实际的实体类,并为其添加所需的属性。
#### 2. 控制客户端实体生成
在某些情况下,我们不希望客户端项目中生成的实体与服务器项目中的实体完全相同。例如,实体可能包含一些不应该传输到客户端或对客户端可见的属性,如密码、图像、计算属性、信用卡号等。我们可以通过以下方法来定制客户端实体的生成和从服务器传输到客户端的数据。
##### 2.1 包含/排除属性
可以使用`Include`和`Exclude`属性(位于`System.ServiceModel.DomainServices.Server`命名空间)来明确指定某个属性是否在客户端生成。默认情况下,实体中返回简单类型(如`string`、`int`和`bool`)或预定义的一组复杂类型(如字节数组)的所有公共属性将自动包含在客户端实体中,除非应用了`Exclude`属性。
```mermaid
graph TD;
A[实体属性] --> B{是否有Exclude属性};
B -- 是 --> C[不包含在客户端实体];
B -- 否 --> D{是否为简单类型或预定义复杂类型};
D -- 是 --> E[包含在客户端实体];
D -- 否 --> F[不包含在客户端实体];
```
##### 2.2 包含/排除关联实体
默认情况下,当请求`Product`实体时,与之关联的`ProductInventory`实体集合不会返回或在客户端项目中可用。如果需要将这些关联实体返回给客户端,并在客户端的`Product`实体上创建访问它们的属性,可以进行以下两个更改:
- **修改域服务中的查询操作**:在返回产品集合的查询操作中,使用`Include`方法请求从数据库中检索与每个产品实体关联的产品库存记录。
```csharp
public IQueryable<Product> GetProducts()
{
return ObjectContext.Products.Include("ProductInventory");
}
```
可以链式调用多个`Include`方法来包含更多关联实体。
- **修改元数据类**:在元数据类中,为`ProductInventory`字段添加`Include`属性,以指示该属性应包含在客户端生成的实体中。
```csharp
[Include]
public EntityCollection<ProductInventory> ProductInventory;
```
#### 3. 使关联实体可编辑
如果要使`ProductInventory`实体可更新,需要在`ProductService`域服务中为`ProductInventory`实体创建插入、更新和删除操作。否则,在Silverlight客户端尝试插入、更新或删除库存实体时会抛出异常。
另一种方法是使用`Composition`属性将实体关联配置为组合层次结构。这样,当子实体更新时,父实体将被标记为更新,并在执行更新操作时将所有子实体(无论是否已修改)发送回服务器,将父实体和子实体视为一个整体。
`ExternalReference`属性用于与`Association`属性配合使用,指定关联关系中的相关实体不应在客户端创建。这是因为RIA服务只允许从单个域服务公开实体,如果从多个域服务公开同一实体,编译应用程序时会出错。
#### 4. 验证
RIA服务试图解决的一个重要问题是验证逻辑需要在服务器和客户端都编写和执行。在两个地方编写相同的逻辑不仅会导致代码重复和工作量增加,而且逻辑很容易不同步。因此,在两个地方执行验证逻辑非常重要,既可以提供响应式的用户界面,又可以确保数据在服务器端得到验证。
##### 4.1 预定义验证属性
可以通过`System.ComponentModel.DataAnnotations`命名空间中的属性为属性应用一些基本的验证规则,如下表所示:
| 属性 | 描述 |
| ---- | ---- |
| `Required` | 指定属性必须有值(非空),默认情况下字符串不能为空,但可以通过`AllowEmptyStrings`属性禁用此行为。 |
| `Range` | 指定属性允许的最小值和最大值。 |
| `StringLength` | 设置字符串属性允许的最小和最大字符数,默认构造函数接受最大长度,可通过`MinimumLength`属性指定最小长度。 |
| `RegularExpression` | 使用正则表达式验证属性的值,例如验证电子邮件地址的格式。 |
示例代码如下:
```csharp
[Required]
[StringLength(50)]
[RegularExpression(@"(?<user>[^@]+)@(?<host>.+)")]
public string
```
0
0
复制全文
相关推荐








