Procedura: aggiungere la logica di business al servizio del dominio

In questo argomento viene illustrato come aggiungere la logica di business a un servizio del dominio in un'applicazione RIA Services . Un servizio del dominio di RIA Services contiene per impostazione predefinita i metodi di aggiornamento, inserimento ed eliminazione, ma spesso è necessario aggiungere una logica di business aggiuntiva che modifica i dati. È inoltre possibile che sia necessario aggiungere metodi che eseguono operazioni diverse dai metodi tradizionali di query, aggiornamento, inserimento o eliminazione. In questo argomento viene illustrato come modificare le operazioni sui dati per soddisfare i requisiti aziendali. Viene inoltre illustrato come aggiungere un metodo di aggiornamento denominato e un'operazione invoke.

Per aggiungere la logica di business ai metodi di modifica dei dati

  1. Creare i metodi di aggiornamento, inserimento o eliminazione necessari nell'applicazione.

    Per creare questi metodi, selezionare Abilita modifica durante la generazione del servizio del dominio nella finestra di dialogo Aggiungi una nuova classe DomainService o aggiungere i metodi che corrispondono alla firma prevista per l'operazione. Per ulteriori informazioni, vedere Servizi del dominio.

  2. Nei metodi di aggiornamento, inserimento o eliminazione aggiungere il codice che specifica la logica per l'elaborazione della richiesta.

  3. Aggiungere eventuali metodi aggiuntivi richiesti per soddisfare il requisito aziendale. Contrassegnare con l'attributo IgnoreAttribute se non si desidera che il metodo venga esposto come servizio.

    Nell'esempio seguente viene illustrato un metodo di inserimento che assegna il venditore se non ne è già stato assegnato uno. Il metodo RetrieveSalesPersonForCompany recupera il nome del venditore per una società se un cliente di tale società è nel database. Il metodo viene contrassegnato con l'attributo IgnoreAttribute per impedire al metodo di essere chiamato come servizio dal 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;
    }
    

Per aggiungere un metodo di aggiornamento denominato

  1. Nella classe del servizio del dominio aggiungere un metodo che corrisponde alla firma prevista per un metodo di aggiornamento denominato.

    Il metodo deve essere contrassegnato con l'attributo UpdateAttribute con la proprietà UsingCustomMethod impostata su true o non deve restituire un valore e accettare un'entità come primo parametro.

    Nell'esempio seguente viene illustrato un metodo che consente a un utente nel ruolo CustomerRepresentative di reimpostare la password di un cliente.

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

    Quando si aggiunge un metodo di aggiornamento denominato, nel progetto client vengono generati due metodi. Un metodo viene generato nel contesto del dominio e un metodo viene generato nell'entità passata come parametro per il metodo di aggiornamento denominato. Eseguire questo metodo di aggiornamento denominato dal client chiamando il metodo generato nel client del dominio o il metodo generato nell'entità. Dopo aver chiamato uno dei due metodi, è necessario chiamare il metodo SubmitChanges, come illustrato nel codice seguente.

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

Per aggiungere un'operazione invoke

  1. Nella classe del servizio del dominio aggiungere un metodo contrassegnato con l'attributo InvokeAttribute.

    Nell'esempio seguente viene illustrato un metodo che recupera la temperatura locale in base al codice postale.

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

    Chiamare il metodo utilizzando un oggetto InvokeOperation, come illustrato nel codice seguente.

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