2010-06-25 8 views
2

Ceci est un projet de preuve de concept - Le but est de créer une application qui reçoit des événements à l'échelle du système et qui, en fonction de certaines règles métier, appelle un flux de travail spécifique.DynamicActivity - Comment appeler un workflow stocké dans la base de données?

Les flux de travail sont créés séparément et la source xaml est stockée dans une base de données.

Voici le code qui permet d'invoquer le flux de travail:

public void RaiseEvent(IEvent e, IEventData eventData) 
{ 

    var typeName = e.GetType().FullName; 

    // Query Db for all workflows for the event 
    var repo = new WorkflowRepository(); 

    var workflows = repo.GetActiveWorkflowsByEvent(typeName); 

    foreach (var wf in workflows) 
    { 

     var condition = 
ConditionEvaluator.PrepareCondition(wf.Condition.Expression, eventData); 

     var okToStart = ConditionEvaluator.Evaluate(condition); 
     if (okToStart) 
     { 

      // Next line is throwing an exeption 
      object o = XamlServices.Parse(wf.WorkflowDefinition.Expression); 


      DynamicActivity da = o as DynamicActivity; 

      WorkflowInvoker.Invoke(da, 
        new Dictionary<string, object> 
         {{ "EventData", eventData }});     


     } 

    } 

Nous avons créé très simple flux de travail qui fonctionne sans problème sur lui-même. Mais quand XAML est chargé à l'aide XamlService.Parse il lancer une exception près:

System.Xaml.XamlObjectWriterException was unhandled 
    Message='No matching constructor found on type 'System.Activities.Activity'. 
You can use the Arguments or FactoryMethod directives to construct this type.' 
Line number '1' and line position '30'. 

Toute idée de ce qui est faux? Merci.

Répondre

2

Je ne sais pas ce qui cause votre problème, je l'ai utilisé XamlServices.Load() dans le passé sans aucun problème, mais la meilleure façon de charger un XAML de flux de travail lors de l'exécution est en utilisant le ActivityXamlServices.Load(). Voir here pour un exemple.

+0

Merci, exactement ce que je faisais. J'ai posté la réponse ci-dessous –

0

Ok je l'ai résolu ce problème en utilisant ActivityXamlServices

Ainsi, au lieu de cette ligne:

object o = XamlServices.Parse(wf.WorkflowDefinition.Expression); 

J'utilise extrait suivant:

var mStream = new memoryStream(
    ASCIIEncoding.Default.GetBytes(wf.WorkflowDefinition.Expression)); 

object o = ActivityXamlServices.Load(mStream);