Contexto de ejecución de complemento

Completado

Cada vez que se ejecuta un complemento (o una extensión de flujo de trabajo personalizada), Microsoft Dataverse pone a disposición una gran cantidad de datos que contienen información sobre el contexto en el que reside la operación actual. Tanto los complementos como los ensamblados de flujo de trabajo personalizados tienen acceso a una clase IWorkflowContext, a la que se puede acceder a través de diferentes métodos.

En los complementos, se accede a IPluginExecutionContext a través del parámetro IServiceProvider del método Execute llamando al método GetService.

public class SamplePlugin : IPlugin

{

public void Execute(IServiceProvider serviceProvider)

{

// Obtain the execution context from the service provider.

IPluginExecutionContext context = (IPluginExecutionContext)

serviceProvider.GetService(typeof(IPluginExecutionContext));

}

}

En las extensiones de flujo de trabajo personalizadas, se pasa IPluginExecutionContext como parámetro del método Execute de tipo CodeActivityContext.

public class SampleWorkflowExtension : CodeActivity

{

protected override void Execute(CodeActivityContext context)

{

// Obtain the execution context from the code activity context.

IWorkflowContext workflowContext = context.GetExtension();

}

}

Tanto IPluginExecutionContext como IWorkflowContext implementan la interfaz IExecutionContext. Cada uno también expone información específica de su tipo. Para más información, vea Entender el contexto de ejecución.

Propiedades de IExecutionContext

Dos de las propiedades más notables de la interfaz IExecutionContext son InputParameters y OutputParameters. Otras propiedades de uso frecuente son PreEntityImages, PostEntityImages y SharedVariables.

InputParameters

Los InputParameters están contenidos en la colección InputParameters del contexto de ejecución y son de tipo Entidad. Esta propiedad permite ver qué valores de entidad se presentaron al complemento antes de la implementación de una operación determinada.

Por ejemplo, si desease validar los datos y evitar que se guarden si la validación no es correcta, los pasos serían similares a los siguientes:

  1. Registre el complemento para ejecutarlo en la etapa de prevalidación de la creación o actualización de la entidad que desea validar.

  2. Valide los datos en el complemento leyendo los valores de la colección InputParameters. En la creación, querrá recuperar la colección Target.

  3. Inicie InvalidPluginExecutionException si los datos proporcionados no son válidos.

O tal vez desee actualizar los valores de la entidad (como quitar caracteres especiales de un número de teléfono) antes de guardar los datos. Puede controlar esta situación con los siguientes pasos:

  1. Registre el complemento para ejecutarlo en la etapa de preoperación de la creación o actualización de la entidad que desea actualizar.

  2. Actualice los datos en el complemento editando los valores de la colección InputParameters. En la creación, querrá recuperar la colección Target.  

OutputParameters

Los parámetros de salida están contenidos en la colección OutputParameters del contexto de ejecución y son de tipo Entidad. Los parámetros de salida solo se proporcionan después de que se ha producido la operación dada. Como tal, solo podrá usar esta colección cuando esté controlando eventos en la etapa de PostOperation. 

Por ejemplo, si desea cambiar los valores que devuelve la operación, puede modificarlos realizando los siguientes pasos:

  1. Registre el complemento para ejecutarlo en la etapa de PostOperation de la creación o actualización de la entidad que desea actualizar.

  2. Actualice los datos en el complemento editando los valores de la colección OutputParameters. En la creación, querrá recuperar la colección Target. 

PreEntityImages y PostEntityImages

Al registrar complementos para ejecutar en el marco de trabajo de eventos, puede proporcionar una copia inmutable o una instantánea de los datos. Esto es ideal sobre todo cuando necesita hacer referencia a valores de los datos antes o después de que se haya producido una operación, por ejemplo, para fines de registro o auditoría personalizada. 

Si bien puede recuperar valores de entidad utilizando el contexto de la organización desde un complemento con una solicitud de recuperación, el uso de imágenes de entidad para realizar esta tarea es mucho más eficiente y altamente recomendable. 

SharedVariables

Las variables compartidas permiten configurar datos que se pueden pasar de un complemento a un paso que se produce más adelante en la canalización de implementación. Si bien recomendamos encarecidamente que configure los complementos para que no tengan estado y no dependan de eventos externos, a veces hay excepciones a esta regla. 

Una excepción podría ser cuando desea asegurarse de que no tiene complementos "fuera de control" en su entorno. Es decir, se están activando en un escenario de recursión infinita. También puede usar el contexto de ejecución para determinar la profundidad en la que el complemento se está ejecutando actualmente, pero, en ciertas situaciones, puede ser apropiado realizar un seguimiento de forma manual. Por ejemplo, quizás el complemento está iniciando por error lógica de actualización dentro de un complemento que está configurado para ejecutarse en la actualización de la entidad, lo que a su vez hace que se ejecute infinitamente. Para solucionar este problema, puede crear un patrón para contar la cantidad de veces que este complemento puede ejecutarse. Un ejemplo podría ser configurar un límite de cinco ejecuciones de un complemento con los siguientes pasos:

  1. En el complemento, compruebe si existe la variable compartida RunCount y, si no es así, cree una que se inicialice en cero.

  2. Compruebe si el valor de la variable RunCount es mayor que cinco, y si es así, inicie InvalidPluginExecutionException.

  3. Al final del complemento, incremente la variable RunCount en 1. 

Nota

Esta es solo una protección adicional contra un error que accidentalmente hace que sus complementos invaden los recursos. Debe asegurarse de que está creando los complementos de tal manera que este escenario nunca ocurra. Dataverse también proporciona garantías para evitar complementos "fuera de control" como estos, pero los métodos de recuperación requieren muchos más recursos que este método y son más difíciles de diagnosticar.