Novedades de Windows Workflow Foundation en .NET Framework 4.5

Windows Workflow Foundation (WF) en .NET Framework 4.5 presenta muchas características nuevas, como nuevas actividades, funcionalidades del diseñador y modelos de desarrollo de flujos de trabajo. Aunque no todas, muchas de las nuevas características de flujos de trabajo presentadas en .NET Framework 4.5 se admiten en el diseñador de flujos de trabajo rehospedado. Para obtener más información sobre las nuevas características que se admiten, consulte Compatibilidad con las nuevas características de Workflow Foundation 4.5 en el diseñador de flujo de trabajo rehospedado. Para más información sobre cómo migrar aplicaciones de flujo de trabajo de .NET Framework 3.0 y .NET Framework 3.5 para usar la versión más reciente, consulte Guía de migración. Este artículo proporciona información general de las nuevas características de flujos de trabajo presentadas en .NET Framework 4.5.

Advertencia

Las nuevas características de Windows Workflow Foundation presentadas en .NET Framework 4.5 no están disponibles para los proyectos que tienen como destino versiones anteriores del marco. Si un proyecto que tiene como destino .NET Framework 4.5 se reorienta a una versión anterior del marco, se pueden producir varios problemas.

  • Las expresiones de C# se reemplazarán en el diseñador por el mensaje El valor se estableció en XAML.
  • Aparecerán muchos errores de compilación, incluido el siguiente.

El formato de archivo no es compatible con el marco de trabajo de destino actual. Para convertir el formato de archivo, guarde explícitamente el archivo. Este mensaje de error desaparecerá después de guardar el archivo y volver a abrir el diseñador.

Control de versiones de flujo de trabajo

.NET Framework 4.5 ha presentado nuevas características de control de versiones basadas en la nueva clase WorkflowIdentity. WorkflowIdentity proporciona a los autores de la aplicación de flujo de trabajo un mecanismo para asignar una instancia de flujo de trabajo persistente con su definición.

Actividades

La biblioteca integrada de actividades contiene nuevas actividades y características para las actividades existentes.

Ámbito de NoPersist

NoPersistScope es una nueva actividad de contenedor que impide que un flujo de trabajo sea persistente cuando se están ejecutando actividades secundarias de NoPersistScope. Esto es útil en escenarios donde no es apropiado que el flujo de trabajo sea persistente, por ejemplo, cuando el flujo de trabajo está usando recursos específicos del equipo como identificadores de archivo o durante transacciones de base de datos. Anteriormente, para evitar la persistencia durante la ejecución de una actividad, era necesaria una NativeActivity personalizada que usara un NoPersistHandle.

Nuevas capacidades de diagrama de flujo

Se han actualizado los diagramas de flujo para .NET Framework 4.5 y tienen las siguientes nuevas funcionalidades:

  • Se puede editar la propiedad DisplayName de una actividad FlowSwitch<T> o FlowDecision. Esto permitirá al diseñador de actividades mostrar más información sobre el propósito de la actividad.

  • Los diagramas de flujo tienen una nueva propiedad denominada ValidateUnconnectedNodes; el valor predeterminado para esta propiedad es False. Si esta propiedad se establece en True, los nodos no conectados del diagrama de flujo generarán errores de validación.

Compatibilidad con la confianza parcial

Los flujos de trabajo en .NET Framework 4 requerían un dominio de aplicación de plena confianza. En .NET Framework 4.5, los flujos de trabajo pueden funcionar en un entorno de confianza parcial. En un entorno de confianza parcial, los componentes de terceros se pueden usar sin garantizarles acceso completo a los recursos del host. A continuación, se presentan algunas cuestiones sobre la ejecución de flujos de trabajo en confianza parcial:

  1. El uso de componentes heredados (incluidas las reglas) incluidos en la actividad Interop no se admite en la confianza parcial.

  2. No se admite la ejecución de flujos de trabajo en confianza parcial en WorkflowServiceHost.

  3. La persistencia de excepciones en un escenario de confianza parcial constituye una amenaza de seguridad potencial. Para deshabilitar la persistencia de excepciones, se debe agregar una extensión de tipo ExceptionPersistenceExtension al proyecto con el fin de descartar la persistencia de las excepciones. En el ejemplo de código siguiente, se muestra cómo implementar este tipo.

    public class ExceptionPersistenceExtension
    {
        public ExceptionPersistenceExtension()
        {
            this.PersistExceptions = false;
        }
        public bool PersistExceptions { get; set; }
    }
    

    Si no se tienen que serializar excepciones, asegúrese de que se usan en un objeto NoPersistScope.

  4. Los autores de actividades deben invalidar CacheMetadata para que el runtime del flujo de trabajo ejecute la reflexión automáticamente en el tipo. Los argumentos y las actividades secundarias no deben ser NULL y se debe llamar a Bind explícitamente. Para obtener más información sobre cómo invalidar CacheMetadata, consulte Exponer datos con CacheMetadata. Además, las instancias de los argumentos que son de un tipo que es internal o private se deben crear explícitamente en CacheMetadata para evitar la creación por reflexión.

  5. Los tipos no usarán ISerializable o SerializableAttribute para la serialización; los tipos que se van a serializar deben admitir DataContractSerializer.

  6. Las expresiones que usan LambdaValue<TResult> requieren RestrictedMemberAccess y, por lo tanto, no funcionarán con la confianza parcial. Los flujos de trabajo que usan LambdaValue<TResult> deben reemplazar dichas expresiones por actividades que se deriven de CodeActivity<TResult>. .

  7. Las expresiones no se pueden compilar mediante TextExpressionCompiler o el compilador hospedado de Visual Basic en confianza parcial, pero se pueden ejecutar las expresiones compiladas anteriormente.

  8. Un único ensamblado que usa transparencia de nivel 2 no se puede usar en .NET Framework 4, .NET Framework 4.6.1 en plena confianza y .NET Framework 4.6.1 en confianza parcial.

Nuevas capacidades de diseñador

Búsqueda de diseñador

Para que los flujos de trabajo mayores sean más fáciles de administrar, ahora se pueden buscar flujos de trabajo por palabra clave. Esta característica solo está disponible en Visual Studio; esta característica no está disponible en un diseñador rehospedado. Hay dos tipos de búsquedas disponibles:

  • Búsqueda rápida, que se inicia con Ctrl+F o con Editar, Buscar y reemplazar y Búsqueda rápida.

  • Buscar en archivos, que se inicia con Ctrl+Mayús+F o con Editar, Buscar y reemplazar y Buscar en archivos.

Observe que Reemplazar no se admite.

Búsqueda rápida

Las palabras clave buscadas en los flujos de trabajo coincidirán con los elementos del diseñador siguientes:

  • Propiedades de los objetos Activity, FlowNode, State y Transition, así como otros elementos de control de flujo personalizados.

  • variables

  • Argumentos

  • Expresiones

La búsqueda rápida se realiza en el árbol de ModelItem del diseñador. La búsqueda rápida no encontrará espacios de nombres importados en la definición de flujo de trabajo.

Buscar en archivos

Las palabras clave buscadas en flujos de trabajo coincidirán con el contenido real de los archivos de flujo de trabajo. Los resultados de la búsqueda se mostrarán en el panel de la vista Resultados de la búsqueda de Visual Studio. Al hacer doble clic, el elemento de resultado navegará a la actividad que contiene la coincidencia en el diseñador de flujo de trabajo.

Eliminar un elemento del menú contextual en el diseñador de variables y argumentos

En .NET Framework 4, las variables y los argumentos solo se podían eliminar en el diseñador con el teclado. A partir de .NET Framework 4.5, las variables y los argumentos se pueden eliminar mediante el menú contextual.

En la captura de pantalla siguiente se muestra el menú contextual del diseñador de variables y argumentos.

Menú contextual del diseñador de variables y argumentos

Rodear de forma automática con secuencia

Debido a que un flujo de trabajo o determinadas actividades de contenedor (como NoPersistScope) solo pueden contener una única actividad de cuerpo, para agregar una segunda actividad el desarrollador tenía que eliminar la primera actividad, agregar una actividad Sequence y, a continuación, agregar ambas actividades a la actividad de secuencia. A partir de .NET Framework 4.5, al agregar una segunda actividad a la superficie del diseñador, se creará una actividad Sequence automáticamente para encapsular ambas actividades.

La captura de pantalla siguiente muestra una actividad WriteLine en Body de NoPersistScope.

Actividad WriteLine en el cuerpo de una actividad NoPersistScope.

La captura de pantalla siguiente muestra la actividad Sequence creada automáticamente en Body cuando se coloca un segundo elemento WriteLine debajo del primero.

Secuencia creada automáticamente en el cuerpo de un elemento NoPersistScope.

Modo panorámico

Para navegar con mayor facilidad en un flujo de trabajo grande en el diseñador, se puede habilitar el modo panorámico, lo que permite al desarrollador hacer clic y arrastrar para mover la parte visible del flujo de trabajo, en lugar de tener que usar las barras de desplazamiento. El botón para activar el modo panorámico está en la esquina inferior derecha del diseñador.

En la captura de pantalla siguiente se muestra el botón de panorámica que se encuentra en la esquina inferior derecha del diseñador de flujo de trabajo.

Botón de desplazamiento lateral resaltado en el diseñador de flujos de trabajo.

El botón central del mouse o la barra espaciadora también se pueden usar para aplicar la panorámica al diseñador de flujo de trabajo.

Selección múltiple

Se pueden seleccionar varias actividades al mismo tiempo; para ello, se arrastra un rectángulo alrededor de ellas (cuando no se ha habilitado el modo panorámico) o manteniendo presionada la tecla CTRL y se hace clic en las actividades deseadas una por una.

Asimismo, se pueden arrastrar y colocar en el diseñador selecciones múltiples de actividad, y también se puede interactuar con ellas mediante el menú contextual.

Vista de esquema de los elementos de flujo de trabajo

Para que sea más fácil navegar en los flujos de trabajo jerárquicos, los componentes de un flujo de trabajo se muestran en una vista de esquema de árbol. La vista Esquema se muestra en la vista Esquema del documento. Para abrir esta vista, desde el menú superior, seleccione Vista, Otras ventanas, Esquema del documento o presione Ctrl W, U. Al hacer clic en un nodo en la vista de esquema navegará a la actividad correspondiente en el diseñador de flujo de trabajo, y la vista de esquema se actualizará para mostrar las actividades seleccionadas en el diseñador.

En la captura de pantalla siguiente del flujo de trabajo completado de Tutorial de introducción, se muestra la vista Esquema con un flujo de trabajo secuencial.

Captura de pantalla de la vista Esquema con un flujo de trabajo secuencial en Visual Studio.

Expresiones de C#

Antes de .NET Framework 4.5, todas las expresiones de los flujos de trabajo solo se podían escribir en Visual Basic. En .NET Framework 4.5, las expresiones de Visual Basic solo se usan para los proyectos creados con Visual Basic. Los proyectos de Visual C# ahora usan C# para expresiones. Se proporciona un editor de expresiones de C# totalmente funcional con capacidades tales como resaltado de gramática e IntelliSense. Seguirán funcionando los proyectos de flujo de trabajo de C# creados en versiones anteriores que usan expresiones de Visual Basic.

Las expresiones de C# se validan en tiempo de diseño. Los errores en las expresiones de C# se marcan con un subrayado ondulado rojo.

Para obtener más información sobre las expresiones de C#, consulte Expresiones de C#.

Más control de la visibilidad de los elementos de barra y de encabezado de shell

En un diseñador rehospedado, algunos de los controles estándar de la interfaz de usuario pueden no tener significado para un flujo de trabajo determinado y se pueden desactivar. En .NET Framework 4, solo la barra del shell de la parte inferior del diseñador admite esta personalización. En .NET Framework 4.5, la visibilidad de los elementos del encabezado del shell en la parte superior del diseñador puede ajustarse si se establece WorkflowShellHeaderItemsVisibility con el valor adecuado de ShellHeaderItemsVisibility.

Conexión e inserción automáticas en flujos de trabajo de diagrama de flujo y de máquina de estados

En .NET Framework 4, las conexiones entre los nodos de un flujo de trabajo de diagrama de flujo tenían que agregarse manualmente. En .NET Framework 4.5, los nodos de diagrama de flujo y de máquina de estados tienen puntos de conexión automática que se hacen visibles cuando se arrastra una actividad del cuadro de herramientas a la superficie del diseñador. Al colocar una actividad en uno de estos puntos se agrega automáticamente la actividad junto con la conexión necesaria.

La captura de pantalla siguiente muestra los puntos de unión que se hacen visibles cuando se arrastra una actividad desde el cuadro de herramientas.

Nodo inicial del diagrama de flujo que muestra puntos de conexión automática

Las actividades también se pueden arrastrar a las conexiones entre los nodos y estados de un diagrama de flujo para insertar automáticamente el nodo entre otros dos nodos. La captura de pantalla siguiente muestra la línea de conexión resaltada donde se pueden arrastrar y colocar actividades del cuadro de herramientas.

Controlador de inserción automática para colocar actividades

Anotaciones del diseñador

Para facilitar el desarrollo de flujos de trabajo de mayor tamaño, el diseñador admite ahora agregar anotaciones para ayudar a realizar el seguimiento del proceso de diseño. Se pueden agregar anotaciones a actividades, estados, nodos del diagrama de flujo, variables y argumentos. En la captura de pantalla siguiente se muestra el menú contextual usado para agregar anotaciones al diseñador.

Captura de pantalla que muestra un menú para agregar anotaciones.

Estados de depuración

En .NET Framework 4, los elementos de no actividad no podían admitir puntos de interrupción de depuración porque no eran unidades de ejecución. Esta versión proporciona un mecanismo para agregar puntos de interrupción a objetos State. Cuando se establece un punto de interrupción en un State, la ejecución se interrumpirá cuando se cambie al estado, antes de que se programen las actividades o desencadenadores de entrada.

Definir y usar objetos ActivityDelegate en el diseñador

Las actividades de .NET Framework 4 usaban objetos ActivityDelegate para exponer puntos de ejecución donde otras partes del flujo de trabajo podían interactuar con la ejecución de un flujo de trabajo, pero para usar estos puntos de ejecución a menudo era necesaria una cantidad de código considerable. En esta versión, los desarrolladores pueden definir y usar delegados de actividad mediante el diseñador de flujo de trabajo. Para más información, consulte Definición y consumo de delegados de actividad en el Diseñador de flujo de trabajo.

Validación en tiempo de compilación

En .NET Framework 4, los errores de validación del flujo de trabajo no se contaban como errores de compilación durante la compilación de un proyecto de flujo de trabajo. Esto significaba que la compilación de un proyecto de flujo de trabajo podía realizarse correctamente aunque hubiera errores de validación del flujo de trabajo. En .NET Framework 4.5, los errores de validación del flujo de trabajo provocan un error en la compilación.

Validación en segundo plano en tiempo de diseño

En .NET Framework 4, los flujos de trabajo se validaban como un proceso en primer plano, lo que podía bloquear la interfaz de usuario durante un proceso de validación complejo o largo. La validación del flujo de trabajo ahora tiene lugar en un subproceso de fondo, para no bloquear la interfaz de usuario.

El estado de la vista se encuentra en una ubicación diferente en archivos XAML

En .NET Framework 4, la información de estado de la vista para un flujo de trabajo se almacena en el archivo XAML en muchas ubicaciones diferentes. Esto es un problema para los desarrolladores que desean leer directamente XAML o escribir código para quitar la información de estado de la vista. En .NET Framework 4.5, la información de estado de la vista del archivo XAML se serializa como un elemento independiente en el archivo XAML. Los desarrolladores pueden localizar y editar fácilmente la información del estado de la vista de una actividad o quitarla por completo.

Extensibilidad de la expresión

En .NET Framework 4.5, se proporciona una manera para que los desarrolladores creen su propia expresión y su propia experiencia de creación de expresiones, que se puede conectar en el diseñador de flujos de trabajo.

Habilitación de las características de flujo de trabajo 4.5 en el diseñador rehospedado

Para mantener la compatibilidad con versiones anteriores, algunas características nuevas incluidas en .NET Framework 4.5 no están habilitadas de manera predeterminada en el diseñador rehospedado. Esto sirve para asegurarse de que las aplicaciones existentes que usan el diseñador rehospedado no dejen de funcionar por la actualización a la versión más reciente. Para habilitar las nuevas características en el diseñador rehospedado, establezca TargetFrameworkName en ".NET Framework 4.5" o establezca miembros individuales de DesignerConfigurationService para habilitar características individuales.

Nuevos modelos de desarrollo de flujo de trabajo

Además de los modelos de desarrollo de flujo de trabajo de diagrama de flujo y secuenciales, esta versión incluye flujos de trabajo de máquina de estados y servicios de flujo de trabajo de contrato primero.

Flujos de trabajo de máquina de estados

Los flujos de trabajo de máquina de estados se presentaron como parte de .NET Framework 4, versión 4.0.1 en la Actualización 1 de la plataforma Microsoft .NET Framework 4. Esta actualización incluía varias clases y actividades nuevas que permitían a los desarrolladores crear flujos de trabajo de máquina de estados. Estas clases y actividades se han actualizado para .NET Framework 4.5. Las actualizaciones incluyen:

  1. Capacidad de establecer puntos de interrupción en estados

  2. Capacidad de copiar y pegar transiciones en el diseñador de flujo de trabajo

  3. Compatibilidad del diseñador para la creación de transiciones de desencadenador compartidas

  4. Actividades usadas para crear flujos de trabajo de máquina de estados, incluidas: StateMachine, State y Transition

En la captura de pantalla siguiente, se muestra el flujo de trabajo de máquina de estados completado del paso Tutorial de introducción al paso Creación de un flujo de trabajo de máquina de estados.

Ilustración en la que se muestra el flujo de trabajo de máquina de estados completado.

Para más información sobre la creación de flujos de trabajo de máquina de estados, consulte Flujos de trabajo de máquina de estados.

Desarrollo de flujo de trabajo de contrato primero

La herramienta de desarrollo del flujo de trabajo de contrato primero permite al desarrollador diseñar un contrato en Code First y, a continuación, haciendo algunos clics en Visual Studio, generar automáticamente una plantilla de actividad en el cuadro de herramientas que representa cada operación. Estas actividades se usan para crear un flujo de trabajo que implemente las operaciones definidas por el contrato. El diseñador de flujo de trabajo validará el servicio de flujo de trabajo para garantizar que estas operaciones se implementan y la signatura del flujo de trabajo coincide con la signatura del contrato. El desarrollador también puede asociar un servicio de flujo de trabajo a una colección de contratos implementados. Para más información sobre el desarrollo del servicio de flujo de trabajo de contrato primero, consulte Procedimiento para crear un servicio de flujo de trabajo que consuma un contrato de servicio existente.