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….