1. 程式人生 > >[WF4.0 實戰] 事件驅動應用

[WF4.0 實戰] 事件驅動應用

and -c put 啟動 eas ets 執行 bookmark 右鍵


看到題目或許非常多人都會疑問,為什麽要使用事件監聽呢?

眼下的認識:

1,使用事件監聽能夠將工作流的結點返回值返回到client

2,能夠實現等待與重新啟動,相當於之前的WaitActivity創建BookMark的方式

至於使用WorkflowInvokerWorkflowApplication這兩種方式臨時還沒能實現工作流的節點值返回到client。可是對於等待流是能夠實現的!

當然要註意的是。假設須要進行事件的監聽。則不能使用WorkflowInvoker或者WorkflowApplication來啟動流程,而是須要通過WorkflowServiceHost來啟動監聽(

並且這裏有個根本差別,WorkflowServiceHost僅僅是啟動監聽,並不馬上創建Workflow的實例)

詳細實現:

WF

拖放一個Receive到PickBranch的Trigger裏面(我們設置了這個Receive的ServiceContractName。和OperationName。能夠隨便取名。沒有太多限制。這裏事實上是使用了WCF的技術。


技術分享


技術分享


我們能夠選擇Receive這個Activity,然後在右鍵菜單中找到Create SendReply,然後找到合適的位置粘貼就可以。能夠生成對應的SendReplyTo,與Receive自己主動關聯


技術分享


那麽,我們究竟要發送什麽數據給用戶呢?能夠點擊Activity上面的Content這個地方


技術分享


WCF

新建一個“控制臺應用程序”(Host,加入對應的引用

技術分享

宿主程序(通過代碼的方式啟動工作流服務)即將工作流作為一種服務公布出去:


namespace Host
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new WorkflowServiceHost(
                new DocumentReviewLib.DocumentReviewWorkflow(),
                new Uri("http://localhost:8080/DRS"));

            host.AddDefaultEndpoints();
            host.Description.Behaviors.Add(
                new ServiceMetadataBehavior() { HttpGetEnabled = true });

            host.AddServiceEndpoint(
                "IMetadataExchange",
                MetadataExchangeBindings.CreateMexHttpBinding(),
                "mex");

            host.Open();
            Console.WriteLine("Server is ready.");
            Console.Read();

        }
    }
}

點擊F5就可以啟動服務,在瀏覽器中能夠查看服務

技術分享


那麽將這部做完以後我們client是如何調用我們封裝的這麽一個工作流的服務呢

我們希望client調用這個工作流的服務呢是一個很松的耦合,那麽我們能夠用一個很easy的辦法,去生成呢對這個服務的一個代理,通過這個代理類來進行調用

生成他的代理類

依據上面頁面的提示,我們能夠產生一個服務代理類。

註意。要使用Visual Studio Command Prompt。而不是默認的cmd

技術分享

技術分享


查看生成的代理類:


技術分享


當中生成的對應方法為:

 public System.Nullable<int> CreateTicket()
    {
        CreateTicketRequest inValue = new CreateTicketRequest();
        CreateTicketResponse retVal = ((IDocumentReview)(this)).CreateTicket(inValue);
        return retVal.@int;
    }

WindowsForms:

我們接下來要設計一個Windows Forms的client程序。來使用該服務,發起流程的操作

將剛才工具所生成的兩個文件加入到當前項目,而且將output.config改動為app.config

假設client為winform或為wpf那麽我們會將這個output改成app.config

怎樣client為webform,我們改名為web.config


技術分享


client調用


技術分享


相應的代碼:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btCreate_Click(object sender, EventArgs e)
        {
            var proxy = new DocumentReviewClient();
            var result = proxy.CreateTicket();

            lstTickets.Items.Add(result);
        }
    }


執行結果:

技術分享

附上整個應用程序說明:

技術分享

以上的演示樣例是通過WCF實現的事件驅動方式,使用這樣的方式有幾種優勢:

1:client調用這個工作流的服務是一個很松的耦合(代理)

2:能夠實現工作流結點往client返回值

3:也是啟動工作流的還有一種方式

總結:

對於學習來說,我們大家都是從不懂到理解更加深刻,或許到如今我們對工作流的理解還存在偏差,還有好多疑問,可是隨著學習的不斷深入。理解也在不斷深入,記得剛開始看關於工作流中的事件驅動時的不理解。但隨著不斷的學習,我們自己也在不斷解決自己的疑問,相信這就是學習的過程!





[WF4.0 實戰] 事件驅動應用