Cuando aplicamos cambios en tiempo de ejecución a un flujo de trabajo, puede que estos cambios contengan errores. Para demostrar esto vamos a crear un nuevo proyecto de tipo Sequential Workflow Console Application al que llamaremos WorkflowSample3.
Arrastramos sobre el diseñador visual de flujos de trabajo una instancia de la actividad CodeActivity y la soltamos en la superficie de diseño. Hacemos clic derecho sobre codeActivity1 y seleccionamos la opción de menú "Generate Handlers".
Igual al artículo anterior ("Agregar actividades en tiempo de ejecución a un flujo de trabajo"), vamos a proceder a crear una instancia de la clase WorkflowChanges y agregar una actividad.
En la vista de código para Workflow1.cs, buscamos el método codeActivity1_ExecuteCode y ponemos lo siguiente:
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
WorkflowChanges lWorkflowChanges = new WorkflowChanges(this);
CodeActivity lCodeActivity = new CodeActivity();
lWorkflowChanges.TransientWorkflow.Activities.Add(lCodeActivity);
this.ApplyWorkflowChanges(lWorkflowChanges);
}
Como verán, al constructor de WorkflowChanges le pasamos "this" ya que la actividad raíz es el mismo flujo de trabajo en el que estamos codificando (Workflow1 hereda de SequentialWorkflowActivity). Luego, instanciamos y agregamos a las actividades del flujo de trabajo una instancia de la clase CodeActivity. Por último, llamamos al método ApplyWorkflowChanges (también de Workflow1).
Si ejecutamos la aplicación así como está, obtendremos el siguiente error:
Esto se debe a que en este caso, CodeActivity requiere que manejemos el evento ExecuteCode (e intencionalmente no lo hicimos).
Modificamos el código del método codeActivity1_ExecuteCode dejándolo de la siguiente manera:
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
WorkflowChanges lWorkflowChanges = new WorkflowChanges(this);
CodeActivity lCodeActivity = new CodeActivity();
lWorkflowChanges.TransientWorkflow.Activities.Add(lCodeActivity);
ValidationErrorCollection lValidationErrorCollection =
lWorkflowChanges.Validate();
if (lValidationErrorCollection.Count > 0)
{
foreach (ValidationError lValidationError in lValidationErrorCollection)
{
Console.WriteLine(lValidationError.ErrorText);
}
}
else
{
this.ApplyWorkflowChanges(lWorkflowChanges);
}
}
Si ejecutamos la aplicación, vamos a ver que no tira excepción pero nos deja el siguiente mensaje:
