成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

嘗試.NET 4.5中狀態(tài)機(jī)工作流

開(kāi)發(fā) 后端
.NET 4.5已經(jīng)出了開(kāi)發(fā)者預(yù)覽版,在Visual Studio 11中已經(jīng)可以嘗試.NET 4.5。本文將給大家介紹其中的狀態(tài)機(jī)工作流。

  NET 4.5 中狀態(tài)機(jī)工作流

  結(jié)尾的總結(jié)有點(diǎn)與本文主題不符,是寫(xiě)文章時(shí)想到的,就順手寫(xiě)上了(^_^)

  例子下載:

  http://files.cnblogs.com/foundation/Wxwinter.Test.Statements.rar

  介紹

  .NET 4.5 中WF已為原WF4.0提供了狀態(tài)機(jī)模式的支持.

  先看一下增加加的Activity

  使用VS2011創(chuàng)建WorkFlow項(xiàng)目,選 .NET 4.5 的WF模板

在WF設(shè)計(jì)界面可以看到狀態(tài)機(jī)模板

由3個(gè)Activity組成

  StateMachin 是狀態(tài)機(jī)容器

  State 是狀態(tài)節(jié)點(diǎn)

  FinalState 是結(jié)束狀態(tài)節(jié)點(diǎn)

  在State 中具有[進(jìn)入狀態(tài)],[結(jié)束狀態(tài)]兩個(gè)執(zhí)行區(qū),可以添加任意Activity,

  FinalState 中具有[進(jìn)入狀態(tài)]

  State可以添加多條分支,在分支上可以設(shè)置[Trigger],[Condition],[Action],這些與WF4.0中其他條件類(lèi)Activity設(shè)置一樣

例子

  用一個(gè)例子演示一下?tīng)顟B(tài)機(jī)的使用

  流程業(yè)務(wù)模型

設(shè)計(jì)書(shū)簽

  1.   publicsealedclassresultBookmark: NativeActivity  
  2.   {  
  3.   publicInArgumentbookmarkName { getset}  
  4.   protectedoverrideboolCanInduceIdle  
  5.   {  
  6.   get 
  7.   { returntrue}  
  8.   }  
  9.   protectedoverridevoidExecute(NativeActivityContextcontext)  
  10.   {  
  11.   stringbookmark = context.GetValue(bookmarkName);  
  12.   context.CreateBookmark(bookmark, newBookmarkCallback(bookmarkCallback));  
  13.   System.Console.WriteLine("創(chuàng)建bookmark:{0}", bookmark);  
  14.   }  
  15.   voidbookmarkCallback(NativeActivityContextcontext, Bookmarkbookmark, objectobj)  
  16.   {  
  17.   if(obj != null)  
  18.   {  
  19.   this.Result.Set(context, obj.ToString());  
  20.   }  
  21.   else 
  22.   {  
  23.   this.Result.Set(context, string.Empty);  
  24.   }  
  25.   }  
  26.   } 

  在設(shè)計(jì)界面用WF構(gòu)建業(yè)務(wù)模型

設(shè)計(jì)State,以[A]節(jié)點(diǎn)為例,其他類(lèi)似

#p#

設(shè)計(jì)宿主

  1. voidworkflowCompleted(WorkflowApplicationCompletedEventArgse)  
  2.   {  
  3.   instance = null 
  4.   System.Console.WriteLine("workflowCompleted:{0}", e.CompletionState.ToString());  
  5.   }  
  6.   voidaborted(WorkflowApplicationAbortedEventArgse)  
  7.   {  
  8.   instance = null 
  9.   System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message);  
  10.   }  
  11.   UnhandledExceptionActionunhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgse)  
  12.   {  
  13.   System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message);  
  14.   returnUnhandledExceptionAction.Cancel;  
  15.   }  
  16.   voidworkflowIdel(WorkflowApplicationIdleEventArgse)  
  17.   {  
  18.   System.Console.WriteLine("Idle:{0}", e.InstanceId);  
  19.   System.Console.WriteLine("--------BookmarkName---------------------------");  
  20.   foreach(varitem ine.Bookmarks)  
  21.   {  
  22.   System.Console.WriteLine("{0}", item.BookmarkName);  
  23.   }  
  24.   System.Console.WriteLine("================================");  
  25.   }  
  26.   WorkflowApplicationinstance = null 
  27.   privatevoidstartButton_Click(objectsender, EventArgse)  
  28.   {  
  29.   valueComboBox.Items.Clear();  
  30.   valueComboBox.Items.Add("A");  
  31.   valueComboBox.Items.Add("B");  
  32.   valueComboBox.Items.Add("C");  
  33.   valueComboBox.Items.Add("E");  
  34.   valueComboBox.SelectedItem = "B" 
  35.   instance = newWorkflowApplication(newmyWorkflow());  
  36.   instance.Completed = newAction(workflowCompleted);  
  37.   instance.OnUnhandledException = unhandledExceptionl;  
  38.   instance.Aborted = aborted;  
  39.   instance.Idle = workflowIdel;  
  40.   instance.Run();  
  41.   }  
  42.   privatevoidsubmitButton_Click(objectsender, EventArgse)  
  43.   {  
  44.   stringbookName =bookmarkTextBox.Text;  
  45.   stringinputValue = valueComboBox.SelectedItem.ToString();  
  46.   if(instance != null)  
  47.   {  
  48.   if(instance.GetBookmarks().Count(p => p.BookmarkName == bookName) == 1)  
  49.   {  
  50.   instance.ResumeBookmark(bookName, inputValue);  
  51.   }  
  52.   else 
  53.   {  
  54.   foreach(varv ininstance.GetBookmarks())  
  55.  {  
  56.   System.Console.WriteLine("--------請(qǐng)從下面選項(xiàng)中選擇一個(gè)BookmarkName---------------------------");  
  57.   System.Console.WriteLine("BookmarkName:{0}:,OwnerDisplayName:{1}", v.BookmarkName, v.OwnerDisplayName);  
  58.   System.Console.WriteLine("================================");  
  59.   }  
  60.   }  
  61.   }  
  62.   else 
  63.   {  
  64.   MessageBox.Show("沒(méi)有創(chuàng)建實(shí)例");  
  65.   }  
  66.   } 

  測(cè)試

總結(jié)

  這本是一個(gè)應(yīng)在NET 4.0 中實(shí)現(xiàn)的功能,其實(shí)不談數(shù)據(jù)結(jié)構(gòu)與運(yùn)行機(jī)制,FlowChar完全可以實(shí)現(xiàn)StateMachin 的所有業(yè)務(wù)邏輯.

  只不過(guò)StateMachin 在VS設(shè)計(jì)器中給人一種更整潔的感覺(jué),不過(guò)這只是展現(xiàn)層面的東西,之前不少人都實(shí)現(xiàn)過(guò)這種效果(包括我自已),理論上并不是很難,但由于WF4.0大部分的功能類(lèi)從繼承Object后就開(kāi)始封閉與工程級(jí)保護(hù),在這種情況下別說(shuō)繼承,就正常連引用都辦不到,當(dāng)然也有辦法解決,不過(guò)實(shí)現(xiàn)后一般只做為概念展現(xiàn),所以很多人在實(shí)際使用時(shí)采取的是自定義流程設(shè)計(jì)器,將FlowChar的結(jié)構(gòu)展現(xiàn)成StateMachin ,通過(guò)攔截Bookmark實(shí)現(xiàn)[進(jìn)入狀態(tài)],[結(jié)束狀態(tài)],其實(shí)這種工作量比傳統(tǒng)意義上開(kāi)發(fā)一套業(yè)務(wù)流程平臺(tái)還有大,但為什么還有使用WF,這是很多人不理解的.其實(shí)使用WF的人基本分為兩類(lèi),一類(lèi)是具備設(shè)計(jì)器開(kāi)發(fā)能力的人,看到VS中的WF設(shè)計(jì)界面后就覺(jué)得WF為其提供了一套拿來(lái)就能用的業(yè)務(wù)流程平臺(tái).這種想法是不對(duì)的,暫不分析WF是否只接適用用戶(hù)業(yè)務(wù),就常識(shí)來(lái)說(shuō),與WCF,WPF并列的WF怎么可能是直接面對(duì)業(yè)務(wù)用戶(hù)的.另一類(lèi)選擇WF的人是看中了WF對(duì)狀態(tài)的副本處理,事物處理,補(bǔ)償處理這些從COM+延續(xù)下來(lái)的理念.很多時(shí)候我一直認(rèn)為WCF +WF就是一個(gè)新版本的COM+

  最后不得不提一下,雖然WF實(shí)現(xiàn)了FlowChar與StateMachin ,但其數(shù)據(jù)結(jié)構(gòu)并不是圖,而是樹(shù).如果既對(duì)Expression Tree熟悉,又對(duì)WF熟悉,你會(huì)發(fā)現(xiàn)Expression Tree就是一個(gè)WF數(shù)據(jù)結(jié)構(gòu)精簡(jiǎn)版.談到Expression Tree了解的人是多了,我也好解釋了,這種數(shù)結(jié)構(gòu)其實(shí)與內(nèi)存中的棧管理方式很象,這就決定了調(diào)用只能指向棧開(kāi)始,而不能任意指向棧的任意位置(不談溢出,GOTO指針這個(gè)層面的問(wèn)題).

  為什么提上面這段內(nèi)容,是因?yàn)槲乙f(shuō)明由于這種數(shù)據(jù)結(jié)構(gòu)我們很難現(xiàn)以下功能(這是一個(gè)業(yè)務(wù)功能,我先用C#風(fēng)格有代碼描述一下):

  上面這段代碼看起來(lái)有些瘋狂,我們不從代碼層面考慮(不加條件判斷,不提動(dòng)態(tài)編譯,ICO,AOP),我只想這樣寫(xiě),我希望當(dāng)程序運(yùn)行到[24]時(shí)自動(dòng)告訴我缺少哪個(gè)上下文(如obj),并讓我補(bǔ)齊上下文后繼續(xù)執(zhí)行.

  將這個(gè)問(wèn)題業(yè)務(wù)化:

  上車(chē)前要買(mǎi)票,(買(mǎi)票是上車(chē)的前置條件)

  但我已經(jīng)上了車(chē)卻沒(méi)買(mǎi)票,是補(bǔ)票還是將我趕下車(chē)買(mǎi)完票再上車(chē).這就是經(jīng)典的[補(bǔ)償處理]機(jī)制

  程序員說(shuō):"你們的業(yè)務(wù)總變,你們都說(shuō)不清,讓我們?cè)趺撮_(kāi)發(fā)"

  客戶(hù)說(shuō):"我們要是業(yè)務(wù)從來(lái)不變,每個(gè)人都能說(shuō)清,要你們開(kāi)發(fā)系統(tǒng)做什么"

  數(shù)學(xué)是嚴(yán)謹(jǐn)?shù)?而真實(shí)的業(yè)務(wù)到處充滿(mǎn)了變通.如何用嚴(yán)謹(jǐn)?shù)臄?shù)學(xué)來(lái)構(gòu)建變通業(yè)務(wù)的邏輯模型才是從事企業(yè)應(yīng)用開(kāi)發(fā)程序員所面臨的問(wèn)題

原文鏈接:http://www.cnblogs.com/foundation/archive/2011/09/19/2181324.html

【編輯推薦】

  1. 調(diào)用ASP.NET工作流:承載及限制
  2. ASP.NET工作流的創(chuàng)建與啟動(dòng)
  3. ASP.NET數(shù)據(jù)庫(kù)連接類(lèi)ClassConn以及oledb數(shù)據(jù)庫(kù)連接方法
  4. ASP.NET數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)的實(shí)現(xiàn):DBHelper
  5. 用C#寫(xiě)的ASP.NET數(shù)據(jù)庫(kù)操作類(lèi)

 

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2024-07-31 08:01:48

2009-07-31 17:50:27

ASP.NET工作流

2009-07-31 17:34:40

ASP.NET工作流

2009-07-31 17:42:33

ASP.NET工作流

2022-10-26 08:00:43

Activiti工作流BPM

2021-10-14 11:34:05

技術(shù)工作流引擎

2011-02-21 13:21:20

.NET Workfl

2009-11-18 09:14:49

Visual Stud

2013-04-23 10:28:08

IBeamMDAAWF

2024-04-25 08:00:00

DevOps架構(gòu)軟件開(kāi)發(fā)

2009-07-31 18:00:35

ASP.NET工作流學(xué)

2010-01-29 09:01:40

.NET 4.0

2010-05-28 15:16:33

SharePoint 工作流

2009-04-15 11:00:31

Workflow工作流角色

2012-07-23 10:36:46

工作流

2009-03-03 09:13:36

工作流BPM業(yè)務(wù)流程

2010-01-04 17:42:50

SilverLight

2023-01-04 08:02:16

工作流架構(gòu)設(shè)計(jì)

2011-12-14 09:58:58

JavajBPM

2023-07-05 09:48:44

Activiti部署
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品美女久久久av超清 | 日韩精品一区二区三区中文在线 | 久久久www成人免费精品 | 国产精品99久久久久久动医院 | 国产亚洲精品久久午夜玫瑰园 | 亚洲一区二区视频在线观看 | 中文字幕在线网 | 久久国产精品久久久久 | 国产精品成人一区二区三区 | 久国产视频 | 精品一区二区三区四区 | 日韩一区二区三区在线视频 | 亚洲一在线 | 久久久久久国产精品免费免费男同 | 成人性视频免费网站 | 国产精品极品美女在线观看免费 | 国产乱码一二三区精品 | 一区二区三区四区视频 | 日韩第一区 | 成人三级视频 | 中文字幕高清 | 久久九九影视 | 成人性生交大片 | 男人天堂色| 色网在线观看 | 日韩视频国产 | 亚洲啪啪 | 亚洲福利在线视频 | h视频在线播放 | 国产在线精品一区二区三区 | 久久av一区二区三区 | 在线看片网站 | 中文字幕亚洲专区 | 在线免费看黄 | 黄网免费| 亚洲一区在线日韩在线深爱 | 日日摸夜夜添夜夜添特色大片 | 国产精品欧美一区二区 | 台湾a级理论片在线观看 | 欧美福利网站 | 国内精品久久久久 |