自定义生成的代码

本主题说明如何自定义在 WCF RIA Services 客户端上生成的代码。在 RIA Services 的某些情况下,您要添加为您的客户端项目生成的代码。但是,您不能直接自定义生成的代码,因为在下次编译中间层代码时将覆盖您的更改。 在生成的代码中提供分部方法,您可以在单独的代码文件中实现它们以自定义客户端层代码。这些分部方法是“挂钩点”,您可使用它们将自己的代码附加到生成的代码。仅在您创建了相应的分部方法时才调用这些方法。

有关自定义生成的代码来在实体类中基于属性计算新值的信息,请参见如何:在客户端上添加计算的属性

分部方法

WCF RIA Services 框架为域上下文类和实体类生成分部方法。

对于域上下文类,提供以下分部方法。

成员 使用

OnCreated()

实例化 DomainContext 对象时执行。

对于实体类,提供以下分部方法。

成员 使用

OnCreated()

实例化实体对象时执行。

OnLoaded(boolean)

在以下情况下执行:首次加载实体并将其反序列化时,或从服务器反序列化实体时但它在客户端上已存在。

On[PropertyName]Changing

在验证后但在设置值前调用。

On[PropertyName]Changed

在刚设置了值后且在调用 RaiseDataMemberChanged 方法前调用。

On[CustomMethodName]Invoking

在调用自定义方法时但是在援用它之前调用。

On[CustomMethodName]Invoked

在调用并援用自定义方法后调用。

实现分部方法

为了使用这些方法,您添加了一个分部类,其名称和命名空间与要自定义的生成类的名称和命名空间相同。由于自动生成的客户端代码与服务器项目上的代码具有相同的命名空间,您的分部类的命名空间通常采用 projectname.Web 格式。然后,您实现在必须执行自定义代码时执行的方法。例如,为了在创建域上下文时加载它,您添加了以下代码:

Imports System.ServiceModel.DomainServices.Client
Namespace Web
  Partial Public Class EmployeeDomainContext
    Inherits DomainContext
    Private Sub OnCreated()
      Me.Load(Me.GetEmployeesQuery())
    End Sub
  End Class
End Namespace
using System.ServiceModel.DomainServices.Client;

namespace RIAServiceExample.Web
{
  public partial class EmployeeDomainContext : DomainContext
  {
    partial void OnCreated()
    {
      this.Load(this.GetEmployeesQuery());
    }
  }
}

您可以在分部方法中设置生成的实体类的属性。例如,如果您的数据库中的 Employee 表包含名为 CreatedBy 的字段,可以通过实现 OnCreated() 的分部方法来设置该属性的值。为了跟踪谁创建了实体的新实例,您添加了以下代码:

Imports System.ServiceModel.DomainServices.Client
Namespace Web
  Partial Public Class Employee
    Inherits Entity
    Private Sub OnCreated()
      Me.CreatedBy = WebContext.Current.User.Name
    End Sub
  End Class
End Namespace
using System.ServiceModel.DomainServices.Client;

namespace RIAServiceExample.Web
{
  public partial class Employee : Entity
  {
    partial void OnCreated()
    {
      this.CreatedBy = WebContext.Current.User.Name;
    }
  }
}

另请参见

任务

如何:在客户端上添加计算的属性