Agregar lógica de negocios al servicio de dominio

En este tema, aprenderá a agregar lógica de negocios a un servicio de dominio en una aplicación de RIA Services . Un servicio de dominio de RIA Services contiene métodos de actualización, inserción y eliminación de forma predeterminada, pero suele ser necesario agregar lógica de negocios adicional que modifique los datos. También puede ser necesario agregar métodos que realizan operaciones que no sean los métodos tradicionales de consulta, actualización, inserción o eliminación. En este tema, aprenderá a modificar operaciones de datos para satisfacer los requisitos de negocios. También aprenderá a agregar un método de actualización con nombres y una operación de invocación.

Para agregar lógica de negocios a métodos de modificación de datos

  1. Cree los métodos de actualización, inserción o eliminación que necesite en su aplicación.

    Puede crear estos métodos seleccionando Habilitar edición al generar el servicio de dominio en el cuadro de diálogo Agregar nueva clase de servicio de dominio o agregando los métodos que coincidan con la signatura esperada para la operación. Para obtener más información, vea Servicios de dominio.

  2. En los métodos de actualización, inserción o eliminación, agregue código que especifique la lógica para procesar la solicitud.

  3. Agregue los métodos adicionales que sean necesarios para cumplir el requisito de negocios. Marque con el atributo IgnoreAttribute si no desea que el método se exponga como un servicio.

    En el ejemplo siguiente se muestra un método de inserción que asigna un vendedor si no hay uno asignado. El método RetrieveSalesPersonForCompany recupera el nombre del vendedor para una compañía si un cliente de esa compañía está en la base de datos. El método se marca con el atributo IgnoreAttribute para evitar que se invoque como un servicio desde el cliente.

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

Para agregar un método de actualización con nombres

  1. En la clase de servicio de dominio, agregue un método que coincida con la signatura esperada para un método de actualización con nombres.

    El método se debe marcar con el atributo UpdateAttribute con la propiedad UsingCustomMethod establecida en true, o no devolverá un valor ni aceptará una entidad como primer parámetro.

    En el ejemplo siguiente se muestra un método que permite a un usuario perteneciente al rol CustomerRepresentative restablecer la contraseña de 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
    }
    

    Cuando se agrega un método de actualización con nombres, se generan dos métodos en el proyecto de cliente. Uno se genera en el contexto de dominio y el otro se genera en la entidad que se pasa como parámetro para el método de actualización con nombres. Este método de actualización con nombres se ejecuta desde el cliente llamando al método generado en el cliente de dominio o al método generado en la entidad. Después de llamar a cualquiera de los métodos, debe llamar al método SubmitChanges, como se muestra en el código siguiente.

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

Para agregar una operación de invocación

  1. En la clase de servicio de dominio, agregue un método marcado con el atributo InvokeAttribute.

    En el ejemplo siguiente se muestra un método que recupera la temperatura local basándose en el código 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
    }
    

    Puede llamar al método utilizando un objeto InvokeOperation, como se muestra en el código siguiente.

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