Perfil de GabrielBiztalk Blandengue (http...FotosBlogListasMais Ferramentas Ajuda

Blog


7/3/2007

DinnerNow.Net análisis de los componentes de Workflow

Microsoft ha publicado una solución para mostrar un conjunto de funcionalidades del Framework 3.0 y Windows Vista en www.dinnernow.net

Disclaimer: La solución es un buen ejemplo de las cosas que se pueden hacer con la plataforma pero no siempre es una guía de buenas prácticas para realizar una aplicación.

Estuve mirando la parte que tiene que ver con Workflow y encontré algunas cosas interesantes para ver que describo a continuación

La solución en "C:\Dinnernow\solution\DinnerNow – OrderProcessing" es la que contiene lo asociado al workflow en WF de DinnerNow.

Tiene 3 folders:

  • Hosts: Es una aplicación de consola que realiza el hosting de los servicios para comunicarse con los workflows. No tiene nada especialmente interesante excepto porque levanta varios ServiceHost para servir a diferentes servicios en la misma aplicación de Consola.
  • Services: Los contratos de servicio y la implementación de los servicios WCF para la aplicación. Aquí OrderService y WorkflowHistoryService son los que tienen relación con el workflow. En particular OrderService es el que levanta el Runtime de workflow y lo conecta con los ExternalDataExchangeService's previstos para los workflows.
  • Workflows: Este folder tiene todos los componentes de la solución de workflow. En particular:
    • Componentes de tracking (ConsoleTrackingService),
    • Activities personalizadas (Activities)
    • Servicios locales de comunicación (LocalService)
    • Workflows uno secuencial y uno de estados embebidos (Workflows / Workflows2)

 

El workflow principal ProcessOrder utiliza las siguientes activities:

  • SaveOrderActivity: Simplemente graba la orden. Lo único interesante aquí es el manejo de una dependencyproperty de tipo clase (aunque no está bien resuelto)
  • splitOrdersActivity: Pasa de la Orden que entra a una orden interna (una especie de mapping). También lo único que hace es manejar un par de DependencyProperties personalizadas.
  • Replicator: Utiliza el replicator de WF para procesar cada una de las ordenes del array construido en el activity anterior
  • OrderPlaceHolder: Un activity de tipo sequence que en realidad solamente se utiliza para inicializar la orden que se va a trabajar en cada iteración del replicador. El replicador en la inicialización de cada Child llena la propiedad de esta activity.
  • InvokeWorkflow: Llama al workflow de máquina de estados
  • Code Activity: Actualiza la instancia de ejecución en una variable (no sé el objetivo)
  • InitiateDelivery: Una sequence activity personalizada que en realidad no hace nada internamente.
  • CreateCorrelation: una activity personalizada que hereda de CallExternalMethod. Lo interesante de esta activity es que la interfaz a la que se asocia y el método que invoca están directamente conectados por código en la activity. Además, al hacer override del MethodName y del InterfaceType y ponerle BrowsableAttribute(false), no se ven en el editor (y no se pueden cambiar J)
  • SubWorkflowCompleted: una activity personalizada que hereda de HandleExternalActivity y tiene el mismo truco que en la anterior para la interfaz y el evento.
  • LogToConsole: Actividad de log simple, hereda de activity y lo único que hace es escribir en la consola el mensaje que se puede poner en el workflow.