[英]Writing a Workflow Foundation workflow with C#
我正在尝试使用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; }
}
}
问题出在条件If()上。 应该是InArgument,但是this.ValidCredential是OutArgument。 我尝试创建一个变量,将ValidCredential的值分配给它。 我还尝试将AuthenticateUserActivity的结果放入变量中,然后将其分配给ValidCredential,但是我收到一条错误消息,指出需要指定Assign的To属性。
我四处寻找适当的教程,但是我发现的是一篇MSDN文章,该文章具有快速而肮脏的代码实现,并且使用文字而不是传递的参数,因此没有任何帮助。
我知道了怎么做。 您只需要从原来的一个创建新的InArgument。 有一个构造函数为此使用一个表达式。
Username = new InArgument<bool>((ActivityContext c) => this.ValidCredential.Get(c))
所以我将整个活动更改为
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
}
}
}
},
};
输入和输出是扩展方法,我写道:
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
}
现在一切都好!
您应该能够使它正常工作。 基本方法应该是使用变量存储数据,使用OutArgument将数据从活动中获取到变量中,使用InArguments将数据从变量中获取到活动中。
还要注意,将InArguments绑定到变量的表达式是VisualBasicValue表达式。 所以像这样:
条件=新的VisualBasicValue(“ System.DateTime.Now.Hour <12”)
这篇博客文章不是关于使用参数和变量的,而是显示了一些示例。
为了无耻地插入我自己为此而制作的库: http : //code.google.com/p/system-transactions/
允许对代码进行基本补偿,而不会造成WF的麻烦。 而且,可以正确编译并且易于调试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.