创建和使用自定义外部数据服务活动Word格式文档下载.docx
《创建和使用自定义外部数据服务活动Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《创建和使用自定义外部数据服务活动Word格式文档下载.docx(6页珍藏版)》请在冰豆网上搜索。
因此,确保MVDataService项目生成时无错误(如生成时有错误,请纠正所有的错误)并已生成了MVDataService程序集。
2.点击操作系统的开始按钮,然后点击运行菜单项打开运行对话框。
3.在打开的组合框控件中输入“cmd”,然后点击确定进入命令提示符窗口。
4.更改起始目录以便我们能直接访问到“MVDataService”程序集。
通常使用的是“cd”命令。
5.wca.exe文件默认情况下被安装到ProgramFiles目录下的WindowsSDK子目录中。
(当然,假如你没有使用默认目录进行安装,你在此需要使用你安装WindwsSDK的目录。
)在命令行提示符下输入下面的命令来执行该工具(包含双引号):
“C:
ProgramFilesMicrosoftSDKsWindowsv6.0ABinWca.exe”MVDataService.dll
按下回车键,该工具的输出结果和下面的类似:
6.在命令提示符中键入dir你可看到wca.exe创建的文件。
7.IMVDataService.Sinks.cs文件不是必须要的,可忽略它甚至是删除它,因为该文件只是包含了一些指示,没有代码。
(在我们的通信接口中没有定义事件。
)我们在第十章将再使用这个文件。
对于另一个生成的文件:
IMVDataService.Invokes.cs文件,是我们要保留的文件。
它包含我们能使用的一个新活动的源代码,该活动可把数据从工作流中发送给宿主应用程序。
因此,我们将重命名该文件以便更加好用。
在命令提示符下输入“renIMVDataService.Invokes.csMVDataUpdate.cs”,然后按下回车键重命名该文件。
8.因为我们刚刚重命名的这个文件是一个工作流活动,因此我们需要把它从当前目录下移动到MVWorkflow目录下以便编译和使用。
在命令提示符下输入“moveMVDataUpdate.cs......MVWorkflow”,然后按下回车键。
9.回到VisualStudio,我们需要把这个新创建的MVDataUpdate.cs文件添加我们的工作流项目中。
10.编译并生成MVWorkflow项目,假如出现编译错误的话,修正所有的错误。
在你成功编译后,在视图设计器界面模式下打开Workflow1.cs文件将会在VisualStudio的工具箱中看到这个MVDataUpdate活动。
备注:
假如MVDataUpdate因为某些原因没有添加进VisualStudio工具箱中,请关闭该解决方案,然后再重新打开它。
我们现在就准备好了一个活动,我们可使用它来把数据发送到我们的宿主应用程序中。
该活动的基类是CallExternalMethod,它的作用是触发对工作流执行环境的外部调用。
添加并配置该工作流通信活动
1.在VisualStudio中以视图设计器的模式打开MVWorkflow项目中的Workflow1.cs文件。
该工作流预先加载了两个活动:
一个是Delay活动,用来模拟处理数据的等待时间;
一个是Code活动,它创建并填充一个基于驾驶员姓名的DataSet。
2.打开VisualStudio工具箱,定位到MVDataUpdate活动。
3.把该活动拖拽到工作流视图设计器界面上,放到Code活动的下面使它在Code活动执行后执行。
4.我们的工作流在视图设计器上的设计工作这就完成了。
现在该写少量代码来进行衔接。
因此以代码视图模式打开Workflow1.cs文件。
在Workflow1类中找到GenerateMVDData方法。
这个方法是codeActivity1所执行的方法,在里面你会看到对GenerateVehicleTable和GenerateViolationTable两个方法的调用,它们创建并填充所要返回的DataSet。
(其实,你可用一些外部服务来为驾驶员的信息进行一个调用,但我们在此对这些进行了模拟)。
在生成了DataSet后,我们需要添加下面的代码以把DataSet返回给宿主:
//AssigntheDataSetwejustcreatedasthehostdata
mvDataUpdate1.mvData=ds;
指定了我们所返回的DataSet后,我们就完成了工作流的开发,并且使用了工具来把该DataSet传给宿主应用程序。
但我们的宿主应用程序需要做些什么才能接收到该数据了?
在宿主应用程序中检索工作流数据
现在让我们返回到我们的主应用程序中。
我们现在要做的是修改应用程序,以使用我们在本章的“创建外部数据访问”这一节中创建的桥接类。
尽管这是一个简化的例子,但这个应用程序仍然是一个完全意义上的WindowsForm应用程序,它演示了怎样处理工作流及其怎样进行多线程操作(比如updating控制的时候)。
为了让我们的接口可使用工作流返回的数据集,我们需要使用桥接代码中的connector类来对我们的工作流实例进行注册(为了使我们能正确的接收DataSet)。
我们也需要勾住(hook)MVDataUpdate事件,以便我们的应用程序知道接收数据的时间。
为方便做这些事。
我们将为“RetrieveMVData”按钮的eventhandler添加一点代码,并为MVDataUpdate添加一个新的eventhandler。
假如你不熟悉匿名方法(anonymousmethods)的话,现在就是简要学习它的一个好机会!
为我们的宿主应用程序添加工作流外部数据服务
1.在VisualStudio解决方案资源管理器中打开Form1.cs文件,并切换到代码视图界面。
2.找到cmdRetrieve_Click方法。
在该响应按钮点击的事件方法中已经存在了初始化工作流实例的代码,但我们还需要在创建工作流实例和启动该实例之间的地方插入一些代码,也就是在调用“_workflowRuntime.CreateWorkflow”的下面添加如下的代码(为让VisualStudio为我们自动生成事件处理程序的代码,请尽量不要使用复制粘贴的方式,应在=号后使用连续两个Tab键):
//Hookreturneddataevent.
MVDataService.WorkflowMVDataServicedataService=
MVDataService.WorkflowMVDataService.CreateDataService(
_workflowInstance.InstanceId,
_workflowRuntime);
dataService.MVDataUpdate+=
newEventHandler<
MVDataService.MVDataAvailableArgs>
(
dataService_MVDataUpdate);
3.在Form1类中,为VisualStudio刚刚创建的dataService_MVDataUpdate事件处理程序添加下面的事件处理代码,并去掉存在的“notimplemented”异常。
dataService_MVDataUpdate
IAsyncResultresult=this.BeginInvoke(
newEventHandler(
delegate
{
//Retrieveconnection.Notewecouldsimplycastthesenderas
//ourdataservice,butwe'
llinsteadbesuretoretrieve
//thedatameantforthisparticularworkflowinstance.
MVDataService.WorkflowMVDataServicedataService=
MVDataService.WorkflowMVDataService.
GetRegisteredWorkflowDataService(e.InstanceId);
//Readthemotorvehicledata
DataSetds=dataService.Read();
//Bindthevehicleslisttothevehiclestable
ListViewItemlvi=null;
foreach(DataRowrowinds.Tables["
Vehicles"
].Rows)
{
//Createthestringarray
string[]items=newstring[4];
items[0]=(string)row["
Plate"
];
items[1]=(string)row["
Make"
items[2]=(string)row["
Model"
items[3]=(string)row["
Color"
//Createthelistitem
lvi=newListViewItem(items);
//Addtothelist
lvVehicles.Items.Add(lvi);
}//foreach
//Bindtheviolationslisttotheviolationstable
Violations"
ID"
Violation"
items[3]=((DateTime)row["
Date"
]).ToString("
MM/dd/yyyy"
);
lvViolations.Items.Add(lvi);
}//delegate
),null,null
//BeginInvoke
this.EndInvoke(result);
//Resetfornextrequest
WorkflowCompleted();
就这样!
我们的应用程序就完成了,编译并执行该应用程序。
当你点击“RetrieveMVData”按钮时,选中的驾驶员姓名就会被传给工作流实例。
当DataSet创建好后,该工作流实例就会激发MVDataUpdate事件。
宿主应用程序代码会截获该事件进行数据的接收,然后把它绑定到ListView控件。
在最后一步我们需注意一个关键的地方,就是在我们调用WorkflowMVDataService的静态方法GetRegisteredWorkflowDataService来检索数据服务包含的DataSet后,我们使用数据服务的Read方法来把该DataSet拉进我们的宿主应用程序执行环境中以便我们进行数据绑定。