How To: Creando Custom Activities en WF

Hola, hoy vamos a ver como crear nuestras propias activities en detalle.

No me voy a detener en como cambiarle el estilo y el diseño a la actividad (ver ActivityDesignerTheme y ActivityDesigner si se quiere profundizar sobre estos temas) ya que Oskar Alvarez escribio un muy buen articulo al respecto.

Empezemos…

Lo primero que vamos a hacer es crear un nuevo proyecto Empty Workflow Project que lo vamos a llamar MyActivities

Una vez creado el proyecto, vamos agregar una activity la cual vamos a llamar EmailActivity.

Inmediatamente vamos a ver nuestra actividad en el diseñador, y ya que estamos le cambiamos la descripcion.

 

Vayamos al codigo a ver que tenemos…

 

public partial class EmailActivity: SequenceActivity

Nuestra clase esta heredando de SequenceActivity, aunque bien podriamos hacer que herede de StateActivity. En nuestro ejemplo solo vamos a hacer que herede de Activity.
(si quieren profundizar mas sobre la jerarquia de clases pueden ver este post de Carlos Segura)

Asi que nuestro codigo y nuestra actividad tendrian que quedar asi:

public partial class EmailActivity: Activity

Perfecto, ya tenemos la primera parte :).

Ahora vamos a definirle una propiedad a nuestra actividad. Esto lo hacemos usando DependencyProperty.

public static DependencyProperty [Dependency Property Name] = DependencyProperty.Register([Property Name], typeof([Property Data Type]), typeof([Activity Class Name])

Vamos a definir nuestra propiedad From:

public static DependencyProperty FromProperty = DependencyProperty.Register("From"
, typeof(string)
                      , typeof(EmailActivity)
                      , new PropertyMetadata("ezequiel@ejemplo.com"
, DependencyPropertyOptions.Metadata
, new ValidationOptionAttribute(ValidationOption.Required)));

Si vemos la definicion que puse arriba, vamos a ver que aparece un parametro nuevo que es PropertyMetadata. Este parametro lo puse porque nuestra propiedad From va a hacer obligatoria, entonces esta propiedad nos sirve para poner un valor default como para ejemplificar cual seria un valor valido.

ValidationOptionAttribute es el atributo que nos va permitir indicarle a nuestra actividad que esta propiedad tiene que ser validada en tiempo de compilacion.

Creemos el get/set:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Browsable(true)]
[Description("The Sender's Address of the Email")]
public string From
{
    get { return (string)base.GetValue(EmailActivity.FromProperty); }
    set { base.SetValue(EmailActivity.FromProperty, value); }
}

Decore nuestra propiedad con una serie de atributos, de los cuales destaque Description, que ya se imaginan que es.

Bien, avanzamos creo yo :). Si compilamos no tendria que haber ningun problema.

Claro, ninguno a la vista :). Es que si ahora usaramos esta actividad en algun workflow, no haria nada!, pero nada de nada!! Tanto trabajo para que?!?!. Yo me voy a dormir…

No desesperen, sigamos al proximo paso…

Vamos a hacer un override del metodo Execute: 

protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
    Console.WriteLine(this.From);
 
    return ActivityExecutionStatus.Closed;
}

Solo le puse que imprima en consola el valor de From para probar si esta funcionando como es esperado.

Asi que vamos a crear rapidamente un proyecto Sequential Workflow Console Application llamado WorkflowConsoleEjercicio.

Seguramente en la toolbox les va a aparecer la actividad EmailActivity, en caso de que no sea asi (o en caso de que quieran agregar esta actividad a algun otro proyecto, sin tener que incorporar el proyecto de la actividad) pueden recurrir al Choose Items de la ToolBox y buscar la dll donde tienen sus activities:

Si agregamos nuestra actividad al diseñador y la seleccionamos, podemos ver las propiedades de la misma:

 

Si ejecutamos el workflow…

(Pongan un Console.ReadLine() en Program.cs asi pueden ver la consola)

 

 

 

 

 

Cambiemos el email en las propiedades por ezequiel@geeks.ms a ver que pasa….

 

 

Como era de esperarse, aparecio :).

Por ultimo veamos que pasa si borramos lo escrito en From:

Perfecto!, el workflow nos esta avisando que no le dimos valor a una propiedad obligatoria.

Bueno, espero que esta introduccion les haya servido, espero sus comentarios y si les interesa podemos seguir sobre este ejemplo y agregar a nuestra actividad por ejemplo una Validator class (una clase que herede de ActivityValidator), hacer que reciba parametros, que envie el mail realmente….

3 comentarios en “How To: Creando Custom Activities en WF”

  1. Hola Ezequiel!
    Muy bien el post, y creo que es muy buena la idea de que nos muestres como añadirle funcionalidad a la actividad personalizada creada con WF a través de distintos atributos, uno de ellos como bien mencionas es ActivityValidator, pero no nos olvidemos de otros referentes al aspecto gráfico como es Designer, a la serialización como es Serializer, a la generación de código como es Code Generator, y el resto que vienen en el SDK…uno interesante por el que me han preguntado en un seminario que he dado en el CIIN es el de Serializer, en el SDK marcan las pautas de como serializar la actividad….
    Un saludo
    JC

  2. Hola,

    Buen articulo el que has realizado!

    Quizas puedas ayudarme o darme algun consejo para un problema que me ha surgido.

    Necesito que realizar un workflow que controle de alguna forma en que metadato de un item se ha hecho click.

    La verdad que estoy un poco perdido, asi que te agradeceria si puedes darme alguna pista.

    un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *