如何:向域服务添加业务逻辑

在本主题中,您将学习如何将业务逻辑添加到 RIA Services 应用程序中的域服务。RIA Services 域服务默认包含更新、插入和删除方法,但您通常需要添加其他用来修改数据的业务逻辑。您可能还需要添加一些方法,用来执行传统的查询、更新、插入或删除方法之外的操作。在本主题中,您将学习如何修改数据操作以满足业务要求。您还将学习如何添加命名更新方法和调用操作。

向数据修改方法添加业务逻辑

  1. 创建您的应用程序所需的更新、插入或删除方法。

    可以通过在**“添加新的域服务类”对话框中生成域服务时选择“启用编辑”**来创建这些方法;也可以通过添加与该操作的预期签名匹配的方法来创建这些方法。有关更多信息,请参见域服务

  2. 在更新、插入或删除方法中,添加代码以指定用于处理该请求的逻辑。

  3. 添加满足业务要求所需的任何其他方法。如果不希望将该方法公开为服务,则使用 IgnoreAttribute 特性标记该方法。

    下面的示例演示一个插入方法,该方法用于分配销售人员(如果尚未分配)。RetrieveSalesPersonForCompany 方法检索公司销售人员的姓名(如果该公司的客户存在于数据库中)。该方法使用 IgnoreAttribute 特性进行了标记,以防止从客户端将该方法作为服务调用。

    Public Sub InsertCustomer(ByVal customer As Customer)
        If (customer.SalesPerson = String.Empty) Then
            customer.SalesPerson = RetrieveSalesPersonForCompany(customer.CompanyName)
        End If
    
        If ((customer.EntityState = EntityState.Detached) _
                    = False) Then
            Me.ObjectContext.ObjectStateManager.ChangeObjectState(customer, EntityState.Added)
        Else
            Me.ObjectContext.Customers.AddObject(customer)
        End If
    End Sub
    
    <Ignore()> _
    Public Function RetrieveSalesPersonForCompany(ByVal companyname As String) As String
        Dim salesPersonToAssign As String = "unassigned"
    
        Dim customers As List(Of Customer)
        customers = GetCustomers().Where(Function(c) c.CompanyName = companyname).ToList()
    
        If (customers.Count > 0) Then
            salesPersonToAssign = customers.First().SalesPerson
        End If
    
        Return salesPersonToAssign
    End Function
    
    public void InsertCustomer(Customer customer)
    {
        if (customer.SalesPerson == String.Empty)
        {
            customer.SalesPerson = RetrieveSalesPersonForCompany(customer.CompanyName);
        }
    
        if ((customer.EntityState != EntityState.Detached))
        {
            this.ObjectContext.ObjectStateManager.ChangeObjectState(customer, EntityState.Added);
        }
        else
        {
            this.ObjectContext.Customers.AddObject(customer);
        }
    }
    
    [Ignore]
    public string RetrieveSalesPersonForCompany(string companyname)
    {
        string salesPersonToAssign = "unassigned";
    
        List<Customer> customers = GetCustomers().Where(c => c.CompanyName == companyname).ToList();
        if (customers.Count > 0)
        {
            salesPersonToAssign = customers.First().SalesPerson;
        }
    
        return salesPersonToAssign;
    }
    

添加命名更新方法

  1. 在域服务类中,添加与命名更新方法的预期签名匹配的方法。

    该方法应使用 UpdateAttribute 特性标记(同时 UsingCustomMethod 属性设置为 true),或是不返回任何值,而是接受某个实体作为第一个参数。

    下面的示例演示一个方法,该方法允许具有 CustomerRepresentative 角色的用户重置客户密码。

    <RequiresRole("CustomerRepresentative")> _
    Public Sub ResetPassword(ByVal customer As Customer)
        ' Implement logic to reset password
    End Sub
    
    [RequiresRole("CustomerRepresentative")]
    public void ResetPassword(Customer customer)
    {
        // Implement logic to reset password
    }
    

    添加命名更新方法时,将在客户端项目中生成两个方法。针对域上下文生成一个方法,同时针对作为参数为命名更新方法传递的实体生成另一个方法。通过调用针对域客户端生成的方法或针对实体生成的方法,从客户端执行这一命名更新方法。调用任一种方法后,必须调用 SubmitChanges 方法,如下面的代码所示。

    selectedCustomer.ResetPassword()
    customerContext.SubmitChanges(AddressOf OnSubmitCompleted, Nothing)
    
    selectedCustomer.ResetPassword();
    customerContext.SubmitChanges(OnSubmitCompleted, null);
    

添加调用操作

  1. 在域服务类中,添加使用 InvokeAttribute 特性标记的方法。

    下面的示例演示一个方法,该方法根据邮政编码检索当地温度。

    <Invoke()> _
    Public Function GetLocalTemperature(ByVal postalcode As String) As Integer
        ' Implement logic to look up temperature
    End Function
    
    [Invoke]
    public int GetLocalTemperature(string postalcode)
    {
        // Implement logic to look up temperature
    }
    

    通过使用 InvokeOperation 对象调用该方法,如下面的代码所示。

    Dim invokeOp As InvokeOperation(Of Integer)
    invokeOp = customerContext.GetLocalTemperature(selectedPostalCode)
    
    InvokeOperation<int> invokeOp = customerContext.GetLocalTemperature(selectedPostalCode);