Actividades personalizadas en Windows WorkFlow Foundation (WWF)
En este articulo aprenderemos los pasos básicos para crear una actividad personalizada dentro den WWF
Actividades personalizadas
Windows WorkFlow Foundation provee varias actividades preestablecidas, como Code activity, Compensate Activity, Delay Activity etc sin embargo dichas actividades difícilmente pueden contemplar todas las diferentes actividades de negocio o técnicas que necesitemos implementar. Es por esto que WWF nos permite crear nuestras propias actividades heredando de diferentes clases base (solo se listan las más importantes):
|
Clase Base |
Descripción |
|
Activity |
Todas las actividades heredan de ésta clase |
|
SequenceActivity |
Es utilizada para crear una actividad compuesta que contiene actividades hijas que son ejecutadas en forma secuencial |
|
StateActivity |
Es utilizado dentro de un StateMachine WorkFlow y expone eventos que permiten la inicialización de la actividad a un estado seleccionado |
|
CompositeActivity |
Permite crear una actividad compuesta sin la posibilidad de tener actividades hijas |
|
|
|
Tabla 1. Principales clases base para crear una actividad personalizada
En este capítulo crearemos una actividad que nos permita realizar el envió de un correo electrónico para lo cual, solo necesitamos heredar de la clase base "Activity" ya ésta clase nos provee toda la funcionalidad básica necesaria.
Para crear la actividad seguiremos los siguientes pasos
- Abrir Visual Studio 2008
- En el menú seleccionar File -> New -> Proyect
- En Proyect Types seleccionar Workflow
- En la lista de plantillas seleccionar WorkFlow Activity Library
- En Name escribir EnviarCorreoActivity
- En el Solution Explorer seleccionar Activity1 y dar clic con el botón derecho del ratón y seleccionar Rename, en el nuevo nombre escribir EnviarCorreoActivity.cs y presionar enter
- En la advertencia de un clic en Yes
- En la clase renombrada dar un clic nuevamente con el botón derecho del raton y seleccionar View Code
- Cambiar la clase de la cual se está heredando SequenceActivity por Activity
En este punto, debemos de tener una clase similar a la siguiente
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace EnviarCorreoActivity
{
public partial class EnviarCorreoActivity: Activity
{
public EnviarCorreoActivity()
{
InitializeComponent();
}
}
}
Para realizar el envió de correo electrónico necesitamos que la actividad exponga 4 propiedades dependientes "Para" "De" "Asunto" y "Cuerpo" para ellos utilizaremos el método Register de la clase DependencyProperty
public static DependencyProperty DeProperty = DependencyProperty.Register("De", typeof(string), typeof(EnviarCorreoActivity));
public static DependencyProperty ParaProperty = DependencyProperty.Register("Para", typeof(string), typeof(EnviarCorreoActivity));
public static DependencyProperty AsuntoProperty = DependencyProperty.Register("Asunto", typeof(string), typeof(EnviarCorreoActivity));
public static DependencyProperty CuerpoProperty = DependencyProperty.Register("Cuerpo", typeof(string), typeof(EnviarCorreoActivity));
Ahora crearemos las propiedades físicas que se encargaran de realizar la persistencia u obtención de la información proporcionada, para ello hay que utilizar los métodos SetValue y GetValue y la clase base.
public string De
{
get
{
return Convert.ToString(base.GetValue(DeProperty));
}
set
{
base.SetValue(DeProperty, value);
}
}
public string Para
{
get
{
return Convert.ToString(base.GetValue(ParaProperty));
}
set
{
base.SetValue(ParaProperty, value);
}
}
public string Asunto
{
get
{
return Convert.ToString(base.GetValue(AsuntoProperty));
}
set
{
base.SetValue(AsuntoProperty, value);
}
}
public string Cuerpo
{
get
{
return Convert.ToString(base.GetValue(CuerpoProperty));
}
set
{
base.SetValue(CuerpoProperty, value);
}
}
Por último sobrescribiremos el método Execute de la clase base, este método es llamado cuando la actividad es requerida para su ejecución, dentro de este método realizaremos el envió del correo electrónico. Como resultado de la ejecución regresaremos el valor Closed solo en caso de que el envió sea exitoso en caso contrario será Faulting este valor es tomado de la enumeración ActivityExecutionStatus
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
try
{
System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient("devworx.com.mx");
smtpClient.Credentials = new System.Net.NetworkCredential("misael.monterroca@devworx.com.mx", "password");
smtpClient.Send(De, Para, Asunto, Cuerpo);
return ActivityExecutionStatus.Closed;
}
catch (Exception ex)
{
string logInterno = ex.Message;
return ActivityExecutionStatus.Faulting;
}
}
Ahora crearemos un WorkFlow para poder probar la actividad creada, para ellos realizaremos las siguientes actividades:
- En el menú de Visual Studio 2008 seleccionaremos File -> Add - New Project
- En las plantillas de proyecto seleccionaremos Sequential WorkFlow Console Application
- En name escribiremos Flujo de Prueba
- En el Solution Explorer seleccionaremos el proyecto recién agregado y con el botón derecho del ratón seleccionaremos la opción Add Reference
- Seleccionar la pestaña Projects
- Seleccionar el proyecto EnviarCorreoActivity y dar un clic en OK
Con los pasos anteriores podremos utilizar la actividad dentro del WorkFlow además de que la actividad será posicionada dentro de la barra de herramientas de Visual Studio 2008

Imagen 1. Actividad dentro de la barra de herramientas
El siguiente paso será arrastrar la actividad EnviarCorreoActivity al diseñador de WorkFlow, seleccionaremos la actividad previamente agregada y presionaremos la tecla F4 para mostrar la ventana de propiedades

Imagen 2. La ventana de propiedades mostrando las propiedades definidas para nuestra actividad
Con este procedimiento hemos creado nuestra primera actividad personalizada solo basta con especificar las propiedades e iniciar el flujo para poder probar que la actividad se está ejecutando de manera correcta.
Articulo Publicado en http://desarrollador.redusers.com/