在本文中,将探讨如何使用Windows Workflow Foundation (WWF) 来构建企业级应用的架构。虽然有关WWF的学习资料很多,但如何将其调整到架构中却鲜有提及。
查看架构图,可以看到用户界面(UI)通过WCF服务与业务层进行交互。WF作为业务层的一部分。也可以将WF服务置于WCF之前,但这样UI层就无法了解WCF的实体。根据最佳实践,不应直接将任何东西暴露给UI层,因此将WF作为UI层的库不是一个好主意。通常,人们使用WF来处理业务规则、状态持久性、事务或一些耗时的过程,因此建议将其放在业务层。在示例中,为了简单起见,没有涉及实体框架和数据库部分。当然,可以添加带有POCO类的实体框架。有很多相关文章,所以认为在实现时不会遇到任何困难。将来,也会提供一些示例。
为了实现这个应用程序,将使用以下技术:
要实现这个项目,应该具备.NET技术的基本了解,比如C#、ASP.NET、WCF、WF。
创建一个名为‘BestPracticeArchitectureWWF’的空白解决方案。
向现有解决方案添加C#库项目。在‘Class1.cs’中添加以下代码。这个方法将接受一个参数,并对其进行一些修改后返回。这是可以使用实体框架调用数据库的地方。
public static string BusinessMethod(string parm1)
{
return parm1 + "\nReturned by Business layer.";
}
向现有解决方案添加WF活动库项目。在Activity1.xaml中添加流程图。
拖动序列到指定位置。选择序列并在参数标签中声明2个参数,如屏幕截图所示。一个用于接受参数,另一个用于返回。
现在,如上面的屏幕截图所示,再拖动两个活动到序列中。一个是赋值活动,另一个是来自原始组面板的调用方法。在赋值活动中,将Argument2变量分配给Argument1 + “Modified in WF”。调用方法是用于调用业务C#库的。添加对C#库的引用。要调用库方法,将Target Type设置为类。方法名称只需键入‘BusinessMethod’。无需填写TargetObject(在TargetType和TargetObject中,只需填写一个)。一个奇怪的是,即使在C#项目中工作,活动表达式只接受VB代码。
这个活动的XAML最终看起来像这样。不需要修改XAML中的任何内容,但有时重命名一些东西时它无法在XAML中更改,那么需要查看它。
添加WCF服务。在Service1.svc.cs中添加以下代码以调用活动。不要忘记更新IService1.cs中的契约。
public string GetData(string value)
{
ActivityLibrary1.Activity1 ca = new ActivityLibrary1.Activity1();
ca.argument1 = value.ToString();
IDictionary dr = new Dictionary();
dr.Add("argument1", value);
var output = WorkflowInvoker.Invoke(ca, dr);
string st = output["argument2"].ToString();
return string.Format("You entered: {0}", st);
}
这个方法从UI接收字符串变量,在WF活动和C#业务库中进行处理。构建WCF服务。
向现有解决方案添加ASP.NET项目。可以使用Silverlight/WPF项目代替ASP.NET。如果想看如何在Silverlight项目中调用WCF,请看另一篇。
向该项目添加服务引用。现在来到Default.aspx,根据以下代码添加一些控件。
WF调用示例
为按钮添加点击事件。在代码后台,将调用WCF服务。
protected void Button1_Click(object sender, EventArgs e)
{
Service1Client sr = new ServiceReference1.Service1Client();
int i = 0;
if (int.TryParse(TextBox1.Text, out i))
{
Label1.Text = sr.GetData(i);
}
else
Label1.Text = "Please enter Number only.";
}
将Web应用程序设置为启动项目,将Default.aspx设置为启动页面。运行应用程序。输入名称并点击按钮,以从WF活动和C#业务库中获取修改。希望这个想法能帮助设计应用程序。