如何:向域服务添加业务逻辑
在本主题中,您将学习如何将业务逻辑添加到 RIA Services 应用程序中的域服务。RIA Services 域服务默认包含更新、插入和删除方法,但您通常需要添加其他用来修改数据的业务逻辑。您可能还需要添加一些方法,用来执行传统的查询、更新、插入或删除方法之外的操作。在本主题中,您将学习如何修改数据操作以满足业务要求。您还将学习如何添加命名更新方法和调用操作。
向数据修改方法添加业务逻辑
创建您的应用程序所需的更新、插入或删除方法。
可以通过在**“添加新的域服务类”对话框中生成域服务时选择“启用编辑”**来创建这些方法;也可以通过添加与该操作的预期签名匹配的方法来创建这些方法。有关更多信息,请参见域服务。
在更新、插入或删除方法中,添加代码以指定用于处理该请求的逻辑。
添加满足业务要求所需的任何其他方法。如果不希望将该方法公开为服务,则使用 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; }
添加命名更新方法
在域服务类中,添加与命名更新方法的预期签名匹配的方法。
该方法应使用 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);
添加调用操作
在域服务类中,添加使用 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);