次の方法で共有


方法: ドメイン サービスにビジネス ロジックを追加する

ここでは、RIA サービス アプリケーションのドメイン サービスにビジネス ロジックを追加する方法について説明します。RIA サービス ドメイン サービスには、既定で Update、Insert、および Delete の各メソッドが含まれていますが、多くの場合、データを変更するビジネス ロジックを追加する必要があります。また、従来の Query、Update、Insert、または Delete の各メソッド以外の操作を実行するメソッドを追加することが必要になる場合もあります。ここでは、ビジネス要件を満たすようにデータ操作を変更する方法について説明します。さらに、名前付き更新メソッドと呼び出し操作の追加方法についても説明します。

ビジネス ロジックをデータ変更メソッドに追加するには

  1. アプリケーションで必要な Update、Insert、または Delete の各メソッドを作成します。

    これらのメソッドを作成するには、[新しいドメイン サービス クラスの追加] ダイアログ ボックスでドメイン サービスを生成するときに [編集の有効化] を選択するか、操作に予想されるシグネチャと一致するメソッドを追加します。詳細については、「ドメイン サービス」を参照してください。

  2. Update、Insert、または Delete の各メソッドで、要求を処理するためのロジックを指定するコードを追加します。

  3. ビジネス要件を満たすために必要な他のメソッドを追加します。メソッドをサービスとして公開しない場合は、IgnoreAttribute 属性でマークします。

    次の例では、販売員が割り当てられていない場合に販売員を割り当てる Insert メソッドを示しています。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. ドメイン サービス クラスで、名前付き更新メソッドに予想されるシグネチャと一致するメソッドを追加します。

    このメソッドは、UsingCustomMethod プロパティが true に設定された UpdateAttribute 属性でマークされているか、値を返さずにエンティティを最初のパラメーターとして受け取る必要があります。

    次の例は、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
    }
    

    名前付き更新メソッドを追加すると、クライアント プロジェクトに 2 つのメソッドが生成されます。一方のメソッドはドメイン コンテキストで生成され、もう一方のメソッドは名前付き更新メソッドのパラメーターとして渡されるエンティティで生成されます。この名前付き更新メソッドをクライアントから実行するには、ドメイン クライアントで生成されたメソッドまたはエンティティで生成されたメソッドを呼び出します。いずれかのメソッドを呼び出した後、次のコードに示すように、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);