Partager via


Procédure : Ajouter une logique métier au service de domaine

Dans cette rubrique, vous allez apprendre comment ajouter une logique métier à un service de domaine dans une application Services RIA . Un service de domaine Services RIA contient des méthodes par défaut de mise à jour, d'insertion et de suppression, mais vous devez souvent ajouter une logique métier supplémentaire qui modifie les données. Vous devrez peut-être aussi ajouter des méthodes qui effectuent des opérations différentes des méthodes traditionnelles de requête, mise à jour, insertion ou suppression. Dans cette rubrique, vous allez apprendre comment modifier des opérations de données pour satisfaire les besoins métier. Vous apprendrez également comment ajouter une méthode de mise à jour personnalisée et une opération d'appel.

Pour ajouter une logique métier aux méthodes de modification de données

  1. Créez les méthodes de mise à jour, d'insertion ou de suppression dont vous avez besoin dans votre application.

    Vous créez ces méthodes soit en sélectionnant Activer la modification lors de la génération du service de domaine dans la boîte de dialogue Ajouter une nouvelle classe de service de domaine, soit en ajoutant les méthodes correspondant à la signature attendue pour l'opération. Pour plus d'informations, consultez Services de domaine.

  2. Dans les méthodes de mise à jour, d'insertion ou de suppression, ajoutez un code qui spécifie la logique de traitement de la demande.

  3. Ajoutez toutes les méthodes supplémentaires nécessaires pour satisfaire les besoins métier. Marquez la méthode avec l'attribut IgnoreAttribute si vous ne voulez pas qu'elle soit exposée en tant que service.

    L'exemple suivant montre une méthode d'insertion qui affecte un vendeur si aucun n'est affecté. La méthode RetrieveSalesPersonForCompany récupère le nom du vendeur d'une société si un client provenant de cette société se trouve dans la base de données. La méthode est marquée avec l'attribut IgnoreAttribute pour empêcher la méthode d'être appelée comme un service à partir du client.

    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;
    }
    

Pour ajouter une méthode de mise à jour personnalisée

  1. Dans la classe DomainService, ajoutez une méthode qui correspond à la signature attendue pour une méthode de mise à jour personnalisée.

    La méthode doit soit être marquée avec l'attribut UpdateAttribute avec la propriété UsingCustomMethod définie avec la valeur true, soit ne pas retourner de valeur et accepter une entité comme premier paramètre.

    L'exemple suivant montre une méthode qui permet à un utilisateur du rôle CustomerRepresentative de réinitialiser le mot de passe d'un client.

    <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
    }
    

    Quand vous ajoutez une méthode de mise à jour personnalisée, deux méthodes sont générées dans le projet client. Une méthode est générée sur le contexte de domaine et une autre sur l'entité transmise sous forme de paramètre pour la méthode de mise à jour personnalisée. Vous exécutez cette méthode de mise à jour personnalisée à partir du client en appelant soit la méthode générée sur le client du domaine, soit la méthode générée sur l'entité. Après avoir appelé l'une des méthodes, vous devez appeler la méthode SubmitChanges, comme indiqué dans le code suivant.

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

Pour ajouter une opération d'appel

  1. Dans la classe DomainService, ajoutez une méthode marquée avec l'attribut InvokeAttribute.

    L'exemple suivant montre une méthode qui récupère la température locale en fonction du code postal.

    <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
    }
    

    Vous appelez la méthode à l'aide d'un objet InvokeOperation, comme indiqué dans le code suivant.

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