企业级应用架构设计示例

在本文中,将探讨如何使用Windows Workflow Foundation (WWF) 来构建企业级应用的架构。虽然有关WWF的学习资料很多,但如何将其调整到架构中却鲜有提及。

架构图

查看架构图,可以看到用户界面(UI)通过WCF服务与业务层进行交互。WF作为业务层的一部分。也可以将WF服务置于WCF之前,但这样UI层就无法了解WCF的实体。根据最佳实践,不应直接将任何东西暴露给UI层,因此将WF作为UI层的库不是一个好主意。通常,人们使用WF来处理业务规则、状态持久性、事务或一些耗时的过程,因此建议将其放在业务层。在示例中,为了简单起见,没有涉及实体框架和数据库部分。当然,可以添加带有POCO类的实体框架。有很多相关文章,所以认为在实现时不会遇到任何困难。将来,也会提供一些示例。

为了实现这个应用程序,将使用以下技术:

  • Microsoft Visual Studio 2010
  • Microsoft Visual Studio 2010 Service Pack 1 (安装程序)
  • Microsoft.NETFramework 4的Update 4.0.3 - Visual Studio 2010 SP1的设计时更新 (KB2600214)
  • Microsoft.NETFramework 4的Update 4.0.3 - 运行时更新 (KB2600211)

要实现这个项目,应该具备.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#业务库中获取修改。希望这个想法能帮助设计应用程序。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485