ASP.NET MVCではWFを使用


本稿はASPに基づく.NET MVCのbetaバージョン.1.まずASPを作成します.NET MVCのアプリ.Webでconfigでは、次の構成を関連する場所に追加します.コードは次のとおりです.
<?xml version="1.0"?>
<configuration>
  <configSections>
   <section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.
WorkflowRuntimeSection,System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35
"/> </configSections> <WorkflowRuntime Name="WorkflowServiceContainer"> <Services> <add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService,
System.Workflow.Runtime,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35
"/> <add type="System.Workflow.Runtime.Hosting.DefaultWorkflowCommitWorkBatchService,
System.Workflow.Runtime,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35
"/> <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService,
System.Workflow.Runtime,Version=3.0.00000.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35
"
UnloadOnIdle="true" LoadIntervalSeconds="5" ConnectionString="Initial Catalog=
WorkflowPersistence;Data Source=localhost\SQLEXPRESS;Integrated Security=SSPI;
"/> </Services> </WorkflowRuntime> <appSettings/> <connectionStrings/> <system.web> <compilation debug="true"> <assemblies> <add assembly="Accessibility,Version=2.0.0.0,Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.Workflow.Runtime, Version=3.0.0.0,Culture=neutral,
PublicKeyToken=31BF3856AD364E35
"/> <add assembly="System.Workflow.ComponentModel, Version=3.0.0.0,Culture=neutral,
PublicKeyToken=31BF3856AD364E35
"/> <add assembly="System.Workflow.Activities, Version=3.0.0.0,Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation> <authentication mode="Windows"/> </system.web> </configuration>
                  ,              。

2. Global.asax.cs Application_Start() Application_End (WorkflowRuntime),
protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    WorkflowRuntime workflowRuntime =new WorkflowRuntime("WorkflowRuntime");            
    workflowRuntime.StartRuntime();          
    Application["WorkflowRuntime"] = workflowRuntime;
}
void Application_End(object sender, EventArgs e)
{            
    WorkflowRuntime workflowRuntime =Application["WorkflowRuntime"] as WorkflowRuntime;
    workflowRuntime.StopRuntime();
}
3.          ,           ,Index         :
<p> <%Html.BeginForm("Compute","Home");%> <label></label><%=Html.TextBox("Number1") %><br /> <label></label><%=Html.TextBox("Number2") %><br /> <input type="submit" value=" "></input><br/> <label></label> <%=Html.Encode(ViewData["Result"]) %> <%Html.EndForm(); %> </p>
HomeControler Compute Action WF 。
4.     HomeControler  Compute Action,    :
int Result = 0;
public ActionResult Compute()
{            
    ControllerContext cxt = this.ControllerContext;
    WorkflowRuntime workflowRuntime = cxt.HttpContext.Application["WorkflowRuntime"] 
as WorkflowRuntime; ManualWorkflowSchedulerService scheduler =workflowRuntime.GetService( typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService; workflowRuntime.WorkflowCompleted+= new EventHandler<WorkflowCompletedEventArgs>( workflowRuntime_WorkflowCompleted); int Number1 = Int32.Parse(Request.Form["Number1"]); int Number2 = Int32.Parse(Request.Form["Number2"]); Dictionary<String, Object> wfPara= new Dictionary<string, object>(); wfPara.Add("Number1", Number1); wfPara.Add("Number2", Number2); WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CaryWFLib.AddWorkflow),
wfPara); instance.Start(); scheduler.RunWorkflow(instance.InstanceId); ViewData["Result"]=Result; return View("Index"); } void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e) { if (e.OutputParameters.ContainsKey("Result")) { Result = (int)e.OutputParameters["Result"]; } }

注:4.1.ASP.NET MVCでは以下のコードによりGlobalを得る.asax.csのApplicationオブジェクト:ControllerContext cxt=this.ControllerContext; WorkflowRuntime workflowRuntime = cxt.HttpContext.Application["WorkflowRuntime"] as WorkflowRuntime; 4.2.ワークフローを呼び出すときに、ManualWorkflowSchedulerServiceをマウントすることが重要です.これにより、ワークフローの同期をASPに実行することができる.NET MVCのスレッド上.サービスワークフローインスタンスをロードしないと、Workflow runtimeによって管理されているスレッドで非同期に実行されます.4.3.ワークフローを呼び出して加算を完了し、結果をビューIndexに返します.
5.次に、WFプログラムを見てみましょう.ワークフローデザイナにCodeActivityをドラッグして、加算の論理を完了します.ワークフローのコードは次のとおりです.
public sealed partial class AddWorkflow: SequentialWorkflowActivity
{
    public int Number1 { get; set; }
    public int Number2 { get; set; }
    public int Result { get; set; }

    public AddWorkflow()
    {
        InitializeComponent();
    }

    private void codeActivity1_ExecuteCode(object sender, EventArgs e)
    {
        Result = Number1 + Number2;
    }
}
6.       ,       :
 
7.  home/index ,        ,         HomeControler Compute Action,         ,