SharePoint 2010: Como iniciar automáticamente un flujo de trabajo!

Una pregunta que me han realizado últimamente es la de si se puede iniciar de forma programática un flujo de trabajo desplegado en un sitio de SharePoint sin esperar a que tenga lugar un cierto evento. Por ejemplo, estoy pensando en iniciar un flujo utilizando una simple aplicación de consola, un servicio de Windows o un Timer Job de SharePoint. La respuesta a la pregunta es que sí, ya que el modelo de objetos nos proporciona lo necesario para instanciar un cierto workflow desplegado en nuestro sitio e iniciarlo. Por ejemplo, el código siguiente muestra como asociar automáticamente un flujo de trabajo de sitio a un sitio en el momento de creación y nos da las pistas para ver como podemos hacer lo mismo en los escenarios mencionados. Como veis, todo pasa por:

  • Crear una instancia de SPWeb, que en este caso obtenemos a partir de las propiedades del manejador.
  • Crear las listas de tareas e historial para el flujo de trabajo si este las necesita.
  • Crear una instancia del flujo de trabajo, para lo que necesitaremos su ID y definir un objeto de tipo SPWorkflowTemplate.
  • Definir la asociación del workflow mediante un objeto de tipo SPWorkflowAssociation.
  • Añadir el workflow en este caso al sitio.
  • Y finalmente arrancar el flujo.
   1: static readonly Guid TemplateID =

   2:     new Guid("abd1d6cc-72a8-4c2f-a567-3118d28f5862");

   3:  

   4: public override void WebProvisioned(SPWebEventProperties properties)

   5: {

   6:  

   7:     SPWeb newSite = properties.Web;

   8:     Guid taskListID = newSite.Lists.Add(

   9:         "Tasks for auto-start workflow", "",

  10:         SPListTemplateType.Tasks);

  11:     Guid historyListID = newSite.Lists.Add(

  12:         "History for auto-start workflow", "",

  13:         SPListTemplateType.WorkflowHistory);

  14:  

  15:     SPWorkflowTemplate template = newSite.WorkflowTemplates[TemplateID];

  16:     SPWorkflowAssociation association =

  17:          SPWorkflowAssociation.CreateWebAssociation(template,

  18:             "Auto-start workflow",

  19:             newSite.Lists[taskListID],

  20:             newSite.Lists[historyListID]);

  21:     newSite.WorkflowAssociations.Add(association);

  22:     newSite.Site.WorkflowManager.StartWorkflow(

  23:          newSite,

  24:          association, "", SPWorkflowRunOptions.Synchronous);

  25:  

  26: }

Finalmente, os dejo una serie de enlaces relacionados con este tema: