Share via


Ejemplo de la utilidad de reflexión de flujos de trabajo

Download sample

La utilidad de reflexión de flujos de trabajo es una herramienta extensible para extraer de un ensamblado la información relacionada con flujo de trabajo. La jerarquía, las reglas declarativas y los servicios locales necesarios de cada flujo de trabajo se muestran en una vista de árbol. Esto hace que sea muy fácil explorar la estructura del flujo de trabajo compilado. Además, cada flujo de trabajo del ensamblado se puede ver como XAML en Bloc de notas o en una superficie de diseñador de otro host. Finalmente, un evaluador de la regla declarativo basado en sustitución proporciona al usuario una manera para realizar el análisis "what if" de la expresiones contenidas.

Utilizar el ejemplo

Siga estos pasos para generar, ejecutar y configurar el ejemplo.

Para generar el ejemplo

  1. Descargue el ejemplo haciendo clic en Descargar ejemplo en este tema.

    Así se extrae el proyecto de ejemplo en su disco duro local.

  2. Haga clic en Inicio, señale Programas, señale Microsoft Windows SDK y, a continuación, haga clic en CMD Shell.

  3. Vaya al directorio de origen del ejemplo.

  4. En el símbolo del sistema, escriba MSBUILD <nombre del archivo de solución>.

Para ejecutar el ejemplo

  • En la ventana del símbolo del sistema del SDK, ejecute el archivo .exe de la carpeta WorkflowReflectionUtility\bin\debug, que se encuentra bajo la carpeta principal del ejemplo.

Para cargar un ensamblado en la utilidad de reflexión de flujos de trabajo:

  1. Inicie el programa WorkflowReflectionUtility.exe

  2. En el menú Archivo, seleccione Abrir.

  3. Seleccione el ensamblado que con el contenido del flujo de trabajo que desea analizar y a continuación, haga clic en Abrir.

  4. Cuando el ensamblado esté, examine la vista de árbol expandiendo los nodos.

    Algunos nodos tienen menús contextuales. Un ejemplo es WorkflowNode, que permite ver el XAML en el Bloc de notas, o ver el flujo de trabajo en una superficie de diseño de otro host.

Archivo de configuración

Un archivo de configuración de la aplicación controla la utilidad de reflexión de flujos de trabajo. Este archivo contiene WorkflowReflectionUtilitySection, que agrega uno o varios objetos ReflectionComponent a la colección de componentes. Si falta el archivo de configuración, la utilidad recurre a una versión codificada y de programación del archivo de configuración predeterminado.

De manera predeterminada, la utilidad de reflexión de flujos de trabajo se configura para mostrar todos los flujos de trabajo del ensamblado. Para cada flujo de trabajo, muestra todas las reglas declarativas, todas las interfaces DataExchangeService utilizadas, y la jerarquía de actividades. Se puede tener acceso al evaluador de expresiones de regla basado en sustitución a través del menú contextual de los nodos de árbol de reglas declarativas. Puede tener acceso a las vistas de diseñador y al XAML utilizando el menú contextual de los nodos de árbol de flujos de trabajo.

Configuración predeterminada

A continuación se muestra la configuración predeterminada:

<configuration>
    <configSections>
        <section name="WorkflowReflectionUtilitySettings" type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.WorkflowReflectionUtilitySection, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
    </configSections>
    <WorkflowReflectionUtilitySettings showAssemblyResolveExplanation="true">
        <components>
            <add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.AssemblyComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            <add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.WorkflowComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            <add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.RuleComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            <add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.XomlContextMenuComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            <add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.RequiredServiceInterfacesComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            <add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.RuleEvaluatorComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            <add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.WorkflowDesignerViewComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            <add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.WorkflowActivitiesComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        </components>
    </WorkflowReflectionUtilitySettings>
</configuration>

Extensibilidad

La utilidad de reflexión de flujos de trabajo se ha diseñado para proporcionar extensibilidad. Para agregar más funcionalidad a la herramienta, debe agregar un nuevo componente derivado del WorkflowReflectionComponent que contiene dos métodos abstractos:

public abstract void Initialize(InitializationContext context);
public abstract void PerformReflection(ReflectionContext context);

Initialize (Método)

Se llama al método Initialize cuando se inicia la utilidad. Permite que el componente se configure automáticamente para ejecutarse en el momento de la reflexión. InitializationContext.AddChild se utiliza para agregar el componente actual como elemento secundario de algún tipo de componente existente. Después de la inicialización, las llamadas a este método crean una estructura de árbol de componentes que representa los pasos emprendidos para realizar la reflexión en el ensamblado. Por ejemplo, AssemblyComponent se agrega como elemento secundario de RootComponent, y WorkflowComponent se agrega como elemento secundario de AssemblyComponent. Así se crea la estructura de llamada siguiente en el momento de la reflexión: Raíz > Ensamblado > Flujo de trabajo. No hay límite en el número de elementos secundarios que puede tener un componente. Tampoco hay límite al número de elementos principales al que se puede agregar un componente secundario determinado.

InitializationContext.AddImage se utiliza para agregar una imagen a la lista de las que se pueden mostrar en la vista de árbol. Cada imagen se almacena en la memoria caché en función del tipo de propietario y un nombre de cadena. Estos dos valores se utilizan como claves para recuperar el índice ImageList para la imagen en el momento de la reflexión.

Método PerformReflection

El método PerformReflection se utiliza para llevar a cabo el trabajo real cuando se carga un ensamblado. ReflectionContext proporciona al componente los descriptores de acceso para el ensamblado, el nodo de árbol actual y la vista de árbol completa. Además, ReflectionContext proporciona métodos para obtener todos los componentes secundarios, obtener los índices de las imágenes almacenadas previamente, y crear un contexto clonado.

Como ejemplo, podemos examinar RuleComponent. RuleComponent se agrega como elemento secundario del componente WorkflowComponent y agrega una imagen almacenada en la memoria caché en tiempo de inicialización. En el momento de la reflexión, el componente tiene acceso al nodo de árbol actual (qué es un WorkflowNode) para obtener el tipo de flujo de trabajo. A continuación, se refleja en este tipo para buscar todas las reglas declarativas y agregar nodos para cada una de ellas. Por cada nodo que agrega, llama al método WorkflowReflectionComponent.InvokeChildComponents con un ReflectionContext clonado que contiene el nodo de regla recientemente agregado.

Este modelo general se puede utilizar para agregar menús contextuales a los nodos, cambiar el texto de los nodos, reorganizar los nodos y agregar nodos secundarios. Para obtener ejemplos y más información, vea el archivo OutOfBoxComponents.cs.

Configurar el nuevo componente

Los componentes nuevos se deben agregar al archivo de configuración para ejecutarse. Para ver la estructura completa del archivo de configuración, consulte la sección "Archivo de configuración" de este tema.

El nuevo nodo de componente tiene el aspecto siguiente:

<add type="[AssemblyQualifiedName of component]"/>

Por ejemplo:

<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.AssemblyComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>

Consulte también

Otros recursos

Ejemplos de aplicaciones
Ejemplos de Windows Workflow Foundation

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.