vendredi 26 mars 2010 07:45 JeremyJeanson
[WF4] Trouver le premier scope accessible
Lors de l'ajout de votre activité dans le Designer, vous pouvez être amené à chercher un scope de variables afin d'y effectuer quelques opérations (ajout, suppression, consultation ...). La méthode décrite ici considère donc que vous êtes dans l'ActivityDesigner de votre activité. Vous allez donc pouvoir utiliser le ModelItem de votre activité afin de parcourir votre workflow durant son édition.
Pour parcourir un Workflow à partir du ModelItem d'un ActivityDesigner les choses sont relativement simples car un ModelItem à une propriété Parent. Ce Parent est le ModelItem parent du ModelItem. On peut donc parcourir un workflow via les proxys des activités qui s'y trouvent. En soit rien de bien compliqué donc.
Les scopes étant des collections de variables publiques, il suffit de trouver une activités qui expose une propriété de ce type et qui soit nommée "Variables".
D'où le code de la méthode GetFirstParentWithVariables qui suit:
Vb
''' <summary> Internal Class VariablesHelper ' Nom de la propriété "Variables" Private Const VariablesPropertyName As String = "Variables" ''' Retouner le premier parent pouvant contenir des variables ''' </summary> ''' <param name="modelItem"></param> ''' <returns></returns> Public Shared Function GetFirstParentWithVariables(ByVal modelItem As ModelItem) As ModelItem ' Test si on trouve une liste de propriétés If (modelItem.Properties _ .Any(Func(c) _ c.Name = VariablesHelper.VariablesPropertyName _ AndAlso c.PropertyType Is GetType(Collection(Of Variable)))) Return modelItem End If ' Test si on a un parent If (modelItem.Parent IsNot Empty) return GetFirstParentWithVariables(modelItem.Parent) Else return Nothing End If End Function End Class
C#
/// <summary> internal static class VariablesHelper { // Nom de la propriété "Variables" private const String VariablesPropertyName = "Variables"; /// Retouner le premier parent pouvant contenir des variables /// </summary> /// <param name="modelItem"></param> /// <returns></returns> public static ModelItem GetFirstParentWithVariables(ModelItem modelItem) { // Test si on trouve une liste de propriétés if (modelItem.Properties .Any(c => c.Name == VariablesHelper.VariablesPropertyName & c.PropertyType == typeof(Collection<Variable>))) { return modelItem; } // Test si on a un parent if (modelItem.Parent != null) { return GetFirstParentWithVariables(modelItem.Parent); } else { return null; } }