2010-08-27 9 views
0

J'essaye d'écrire des activités avec C# au lieu du concepteur et du XAML. VS2010 a été bogué et très lent pour cela, et il a aussi un très mauvais support de compilation (pour les noms de variables, les propriétés et ainsi de suite). Donc, j'essaye de créer des activités en héritant de la classe Activity directement, mais je rencontre un problème.Écrire un flux de travail Workflow Foundation avec C#

Voici mon code:

public class TestActivity : Activity 
{ 
    public InArgument<string> Username { get; set; } 
    public InArgument<string> Password { get; set; } 
    public OutArgument<bool> ValidCredential { get; set; } 
    public OutArgument<ProvisioningRole> Role { get; set; } 
    public OutArgument<Guid> Guid { get; set; } 

    protected override Func<Activity> Implementation 
    { 
     get 
     { 
      return() => 
       { 
        return new Sequence() 
        { 
         Activities = 
         { 
          new AuthenticateUserActivity() 
          { 
           Username = this.Username, 
           Password = this.Password, 
           Guid = this.Guid, 
           Result = this.ValidCredential 
          }, 
          new If() 
          { 
           Condition = this.ValidCredential, 
           Then = new GetUserRoleActivity() 
           { 
            Username = this.Username, 
            Password = this.Password, 
            Result = this.Role 
           } 
          }, 
         } 
        }; 
       }; 
     } 
     set { base.Implementation = value; } 
    } 
} 

Le problème est le cas(), la condition. C'est supposé être un InArgument, mais this.ValidCredential est un OutArgument. J'ai essayé de créer une variable, lui assigner la valeur de ValidCredential. J'ai également essayé de mettre le résultat de AuthenticateUserActivity dans la variable, puis l'assigner à ValidCredential, mais j'obtiens une erreur disant que la propriété To d'Assign doit être spécifiée. J'ai cherché des didacticiels appropriés, mais tout ce que j'ai trouvé était un article MSDN qui avait une implémentation de code rapide et sale, et il utilisait des littéraux au lieu des arguments passés, donc pas d'aide à partir de là.

Répondre

0

Voulez-vous brancher sans vergogne ma propre bibliothèque que je fini par faire pour cela: http://code.google.com/p/system-transactions/

Permet une compensation de base du code sans les tracas ginormous de WF. En outre, compile correctement et est facilement débogable.

1

Vous devriez pouvoir faire fonctionner ceci. L'approche de base devrait être d'utiliser une Variable pour stocker des données, utiliser un OutArgument pour extraire des données des activités dans la Variable et InArguments pour obtenir des données d'une Variable dans une activité.

Notez également que les expressions pour lier InArguments aux variables sont des expressions VisualBasicValue. Donc, quelque chose comme:

Condition = new blog post VisualBasicValue ("System.DateTime.Now.Hour < 12")

This n'est pas sur l'utilisation des arguments et des variables, mais montre quelques exemples .

4

J'ai découvert comment faire. Vous avez juste besoin de créer un nouvel InArgument à partir de l'original. Il y a un constructeur qui prend une expression pour cela.

Username = new InArgument<bool>((ActivityContext c) => this.ValidCredential.Get(c)) 

Je changé mon activité tout à

return new CompensableActivity() 
{ 
    Body = new Sequence() 
    { 
     Activities = 
      { 
       new AuthenticateUserActivity() 
       { 
        Username = this.Username.In(), 
        Password = this.Password.In(), 
        Guid = this.Guid.Out(), 
        Result = this.ValidCredential.Out() 
       }, 
       new If(this.ValidCredential.In()) 
       { 
        Then = new GetUserRoleActivity() 
        { 
         Username = this.Username.In(), 
         Password = this.Password.In(), 
         Result = this.Role.Out() 
        }, 
        Else = new Assign<ProvisioningRole>() 
        { 
         To = this.Role.Out(), 
         Value = ProvisioningRole.User 
        } 
       } 
      } 
    }, 
}; 

In et Out étant des méthodes d'extension I écrivaient:

public static class WorkflowExtensions 
{ 
    #region In 
    public static InArgument<T> In<T>(this InArgument<T> self) 
    { 
     return new InArgument<T>(context => self.Get(context)); 
    } 

    public static InArgument<T> In<T>(this OutArgument<T> self) 
    { 
     return new InArgument<T>(context => self.Get(context)); 
    } 
    #endregion 

    #region Out 
    public static OutArgument<T> Out<T>(this InArgument<T> self) 
    { 
     return new OutArgument<T>(context => self.Get(context)); 
    } 

    public static OutArgument<T> Out<T>(this OutArgument<T> self) 
    { 
     return new OutArgument<T>(context => self.Get(context)); 
    } 
    #endregion 
} 

Et maintenant tout va bien!