Compartir a través de


Entender el contexto de ejecución

La Canalización de ejecución de eventos pasa a los complementos registrados una cantidad grande de datos sobre la operación que se procesa en estos momentos y el entorno de ejecución del código personalizado. Las siguientes secciones describen los datos que se pasan a su complemento o actividad de flujo de trabajo personalizado.

Acceder al contexto de ejecución para complementos

Con los complementos, acceda a estos datos en el código estableciendo una variable que implemente la IPluginExecutionContext interfaz:

// Obtain the execution context from the service provider.  
IPluginExecutionContext context = (IPluginExecutionContext)
    serviceProvider.GetService(typeof(IPluginExecutionContext));

Esto IPluginExecutionContext proporciona información sobre el Stage para el cual está registrado el complemento, así como información sobre el ParentContext.

Más información: ParentContext

Acceder al contexto de ejecución para actividades personalizadas de flujo de trabajo

Con las actividades de flujo de trabajo personalizadas, acceda a estos datos en el código estableciendo una variable que implemente la IWorkflowContext interfaz:

// Obtain the execution context using the GetExtension method.  
protected override void Execute(CodeActivityContext context)
{
 IWorkflowContext workflowContext = context.GetExtension<IWorkflowContext>();
...

Este IWorkflowContext proporciona información sobre el flujo de trabajo en el que se ejecuta la actividad de flujo de trabajo personalizado.

Propiedad Descripción
ParentContext Obtiene el contexto principal. Consulte ParentContext
StageName Obtiene la información de la fase de la instancia de proceso.
WorkflowCategory Obtiene la información de categoría del proceso de la instancia del proceso: Es un flujo de trabajo o un diálogo (obsoleto).
WorkflowMode Indica cómo se debe ejecutar el flujo de trabajo. 0 = asincrónico, = 1 sincrónico

ParentContext

El ParentContext proporciona información sobre cualquier operación que desencadene la ejecución del complemento o de la actividad de flujo de trabajo personalizada.

Excepto para casos documentados específicos, evite depender de los valores que encuentre en ParentContext para aplicar su lógica empresarial. No se garantiza el orden específico en el que se producen las operaciones y puede cambiar con el tiempo.

Si decide tomar una dependencia de los valores que se encuentran en ParentContext, siga los pasos necesarios para asegurarse de que el código es resistente para adaptarse a posibles cambios. Pruebe la lógica periódicamente para comprobar que las condiciones de las que depende permanecen en vigor con el tiempo.

ExecutionContext

La IExecutionContext interfaz proporciona el resto de la información. Las IPluginExecutionContext clases y IWorkflowContext implementan esta interfaz.

En el caso de los complementos, todas las propiedades de esta clase de contexto de ejecución proporcionan información útil a la que es posible que tenga que acceder en el código.

Nota

En el caso de las actividades de flujo de trabajo personalizadas, normalmente no se usan estas propiedades.

Dos de las propiedades más importantes son las propiedades InputParameters y OutputParameters.

Otras propiedades usadas con frecuencia son SharedVariables, PreEntityImages y PostEntityImages.

Sugerencia

Una buena manera de visualizar los datos que se pasan al contexto de ejecución es instalar la solución Plug-in Profiler que está disponible como parte de la herramienta Registro de complementos. El generador de perfiles captura la información de contexto, así como la información que permite reproducir el evento localmente para que pueda depurar. En la herramienta de registro de complementos, puede descargar un documento XML con todos los datos del evento que desencadenó el flujo de trabajo. Para obtener más información, consulte Visualización de los datos del perfil del complemento.

ColeccionesDeParámetros

Todas las propiedades del contexto de ejecución son de solo lectura. Pero los InputParameters, OutputParameters, y SharedVariables son valores ParameterCollection. Puede cambiar el comportamiento de la operación modificando los valores de los elementos de estas colecciones, en función de la fase de la canalización de ejecución de eventos para la que está registrado el complemento.

Los valores ParameterCollection se definen como estructuras KeyValuePair. Para acceder a una propiedad, debe conocer el nombre de la propiedad que expone el mensaje. Por ejemplo, para tener acceso a la Entity propiedad que se pasa como parte de CreateRequest, debe saber que el nombre de esa propiedad es Target. A continuación, puede acceder a este valor mediante código similar al siguiente:

var entity = (Entity)context.InputParameters["Target"];

Use la documentación de Microsoft.Xrm.Sdk.Messages y Microsoft.Crm.Sdk.Messages para conocer los nombres de los mensajes definidos en los ensamblados del SDK. Para acciones personalizadas, consulte los nombres de los parámetros definidos en el sistema.

ParámetrosDeEntrada

InputParameters representa el valor de la propiedad OrganizationRequest.Parameters que representa la operación procedente de los servicios web.

Como se describe en Uso de mensajes con el SDK para .NET, todas las operaciones que se producen en el sistema son en última instancia instancias de la OrganizationRequest clase que procesa el IOrganizationServicemétodo .Execute

Como se describe en Event Framework, las operaciones pasan por una serie de fases. Puede registrar su complemento en las etapas que ocurren antes de que los datos se escriban en la base de datos. En las fases PreValidation y PreOperation, puede leer y cambiar los valores de los InputParameters de modo que puede controlar el resultado esperado de la operación de datos.

Si encuentra que los valores de la InputParameters colección representan una condición que no se puede permitir, lance un InvalidPluginExecutionException (preferiblemente en la etapa PreValidation) que cancele la operación y muestre un error al usuario usando un complemento sincronico, o registre el error si el complemento es asincronico. Para obtener más información, consulte Cancelación de una operación.

ParámetrosDeSalida

OutputParameters representa el valor de la propiedad OrganizationResponse.Results que representa el valor de devolución de la operación. Cada una de las clases de respuesta de mensaje que se deriva de OrganizationResponse contiene propiedades específicas. Para acceder a estas propiedades, use el valor de clave que suele ser el mismo que el nombre de las propiedades de la clase de respuesta. Sin embargo, esto no siempre es cierto. La siguiente tabla muestra las propiedades de clases de respuesta de mensaje que tienen claves diferentes del nombre de las propiedades.

Clase de respuesta Propiedad Valor de clave
BackgroundSendEmailResponse EntityCollection BusinessEntityCollection
CloneContractResponse Entity BusinessEntity
CloneMobileOfflineProfileResponse CloneMobileOfflineProfile EntityReference
CloneProductResponse ClonedProduct EntityReference
ConvertSalesOrderToInvoiceResponse Entity BusinessEntity
CreateKnowledgeArticleTranslationResponse CreateKnowledgeArticleTranslation EntityReference
CreateKnowledgeArticleVersionResponse CreateKnowledgeArticleVersion EntityReference
GenerateQuoteFromOpportunityResponse Entity BusinessEntity
GetDefaultPriceLevelResponse PriceLevels BusinessEntityCollection
RetrieveResponse Entity BusinessEntity
RetrieveMultipleResponse EntityCollection BusinessEntityCollection
RetrievePersonalWallResponse EntityCollection BusinessEntityCollection
RetrieveRecordWallResponse EntityCollection BusinessEntityCollection
RetrieveUnpublishedResponse Entity BusinessEntity
RetrieveUnpublishedMultipleResponse EntityCollection BusinessEntityCollection
RetrieveUserQueuesResponse EntityCollection BusinessEntityCollection

El sistema no rellena OutputParameters hasta después de la transacción de base de datos, de modo que solo están disponibles para complementos registrados en la fase PostOperation. Si desea cambiar los valores devueltos por la operación, puede modificarlos en los OutputParameters.

Variables compartidas

Use la SharedVariables propiedad para pasar datos de la API o un complemento a un paso que se produzca más adelante en la canalización de ejecución. Dado que esta propiedad es un ParameterCollection valor, los complementos pueden agregar, leer o modificar propiedades para compartir datos con pasos posteriores.

En el ejemplo siguiente se muestra cómo pasar un PrimaryContact valor de un complemento registrado para un paso PreOperation a un paso PostOperation .

public class PreOperation : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        // Obtain the execution context from the service provider.
        Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
            serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

        // Create or retrieve some data that will be needed by the post event
        // plug-in. You could run a query, create an entity, or perform a calculation.
        //In this sample, the data to be passed to the post plug-in is
        // represented by a GUID.
        Guid contact = new Guid("{74882D5C-381A-4863-A5B9-B8604615C2D0}");

        // Pass the data to the post event plug-in in an execution context shared
        // variable named PrimaryContact.
        context.SharedVariables.Add("PrimaryContact", (Object)contact.ToString());
    }
}

public class PostOperation : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        // Obtain the execution context from the service provider.
        Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
            serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

        // Obtain the contact from the execution context shared variables.
        if (context.SharedVariables.Contains("PrimaryContact"))
        {
            Guid contact =
                new Guid((string)context.SharedVariables["PrimaryContact"]);

            // Do something with the contact.
        }
    }
}

Importante

Debe agregar datos serializables a la colección de variables compartidas. De lo contrario, el servidor no sabe cómo serializar los datos y se produce un error en la ejecución del complemento.

Nota

Para que un complemento registrado para las fases PreOperation o PostOperation tenga acceso a las variables compartidas de un complemento registrado para la fase PreValidation que se ejecuta al Crear, Actualizar, Eliminar o por una RetrieveExchangeRateRequest, debe tener acceso a la colección ParentContext.SharedVariables. Para el resto de los casos, IPluginExecutionContext.SharedVariables contiene la colección.

Pasar una variable compartida desde la API

Para introducir una variable compartida al llamar a una API, use la palabra clave tag de la API web o el SDK para .NET para pasar un valor de cadena.

Puede acceder a este valor en la colección Variable compartida mediante la tag clave . Una vez establecido, no se puede cambiar este valor.

Para obtener más información, consulte Agregar una variable compartida al contexto de ejecución del complemento.

Imágenes de la entidad

Al registrar un paso para un complemento que incluya una tabla como uno de los parámetros, puede especificar que una copia de los datos de la tabla se incluya como una instantánea o una imagen mediante las PreEntityImages propiedades y PostEntityImages .

Estos datos proporcionan un punto de comparación para los datos de tabla mientras atraviesan la canalización de eventos. El uso de estas imágenes proporciona un rendimiento mucho mejor que incluir código en un complemento para recuperar una tabla solo para comparar los valores de atributo.

Al definir una imagen de la entidad, especifique un valor de alias de entidad que puede usar para tener acceso a la imagen específica. Por ejemplo, si define una imagen de una pre-entidad con el alias 'a', puede usar el siguiente código para acceder al valor del atributo name.

var oldAccountName = (string)context.PreEntityImages["a"]["name"];

Más información:

Consultar también

Marco de trabajo de eventos
Escribir un complemento