使用C#编写Workflow Foundation工作流程

Chr*_*ers 0 c# workflow-foundation workflow-foundation-4

我正在尝试使用C#而不是设计器和XAML编写一些活动。VS2010一直存在错误,并且运行缓慢,并且它对编译的支持也很差(变量名称,属性等)。

因此,我试图通过直接从Activity类继承来创建活动,但是遇到了麻烦。

这是我的代码:

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题出在条件If()上。应该是InArgument,但是this.ValidCredential是OutArgument。我尝试创建一个变量,将ValidCredential的值分配给它。我还尝试将AuthenticateUserActivity的结果放入变量中,然后将其分配给ValidCredential,但是我收到一条错误消息,指出需要指定Assign的To属性。

我四处寻找合适的教程,但是我发现的是一篇MSDN文章,该文章具有快速而肮脏的代码实现,并且使用文字而不是传递的参数,因此没有任何帮助。

Chr*_*ers 5

我知道了怎么做。您只需要从原来的一个创建新的InArgument。有一个构造函数为此使用一个表达式。

Username = new InArgument<bool>((ActivityContext c) => this.ValidCredential.Get(c))
Run Code Online (Sandbox Code Playgroud)

所以我将整个活动更改为

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
                    }
                }
            }
    },
};
Run Code Online (Sandbox Code Playgroud)

输入和输出是扩展方法,我写道:

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
}
Run Code Online (Sandbox Code Playgroud)

现在一切都好!