2015-10-27 3 views
1

Nous souhaitons créer des workflows conçus par les utilisateurs finaux. J'ai pu stocker des définitions de workflow dans la base de données, les recharger et les faire fonctionner dans un service. Pour que l'utilisateur puisse créer des workflows, nous devons créer nos propres activités. Je voudrais passer des arguments non simples (ie List, List) aux activités internes. J'ai lu de nombreux articles sur le passage des arguments mais je n'ai pas pu trouver celui qui corresponde à mes besoins, tous les articles montrent comment passer l'argument à l'activité principale du workflow uniquement (en utilisant la méthode Dictionary in WorkflowInvoker.Invoke).Comment passer des arguments non-string aux activités internes?

Nous avons une bibliothèque avec une activité CodeActivity1 avec un argument Arg1 (List). L'utilisateur final utilisera cette bibliothèque pour créer une nouvelle activité (une séquence par exemple).

Activity1 act1 = new Activity1(); 
act1.Arg1 = new InArgument<List<string>>(new List<string> { "a", "b", "c" }); 

Sequence seq = new Sequence 
{ 
    Activities = { act1 }; 
} 

// Now serialize end user workflow 
Stream newStream = ...; 
XamlWriter l_xamlWriter = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(newStream, new XamlSchemaContext())); 

XamlServices.Save(l_xamlWriter, seq); 

Comment initialiser un argument avec une liste? (l'ancien code échoue avec 'Literal': Literal ne supporte que les types de valeur et le type immuable System.String).

Existe-t-il un moyen de transmettre de tels arguments aux activités internes ou un moyen de traduire ces arguments dans VisualBasicValue ou CSharpValue par programmation pour permettre de sérialiser les définitions de workflow? Nous ne voulons pas définir ces arguments chaque fois que nous exécutons le flux de travail, nous voulons que la valeur soit stockée dans la définition.

Toute aide serait appréciée :-)

Répondre

0

La seule façon que j'ai trouvé pour envelopper la séquence dans un DynamicActivity et de passer des paramètres à la WorkflowApplication (ou WorkflowInvoker):

Activity1 act1 = new Activity1(); 
act1.Arg1 = new InArgument<Collection<string>>(new VisualBasicValue<Collection<string>>("MyVals")); 

Sequence seq = new Sequence 
{ 
    Activities = { act1 }; 
} 

DynamicActivity da = new DynamicActivity() 
{ 
    Name = "test", 
    Implementation =() => seq, 
    Properties = 
      { 
       new DynamicActivityProperty() 
       { 
        Name = "MyVals", 
        Type = typeof(InArgument<Collection<string>>), 
        Value = null 
       }, 
      } 
}; 



WorkflowInvoker.Invoke(da, new Dictionary<string, object> { { "MyVals", new Collection<string>{ "a", "b", "c" } } }); 

Tant et si bien code juste pour passer une liste ...