現在應該講主控制類了,為了不把系統弄得太復雜,所以就用一個類作為主要控制類(服務類),作為前端、后端、業務邏輯的控制類。
WorkflowService類的類圖如下:
該類的構造函數:
1 public WorkflowService(IWorkflowDB workflowDb, IWorkflowMethods workflowMethods)2 {3 _iWorkflowDb = workflowDb;4 _iWorkflowMethods = workflowMethods;5 }
通過簡單工廠方法返回類的實例:
1 /// <summary> 2 /// 程序主調用方法 3 /// </summary> 4 /// <returns></returns> 5 public static WorkflowService GetWorkflowService() 6 { 7 IWorkflowDB iWorkflowDb; 8 try 9 {10 string dbSavingPRovider = WorkFlowUtility.GetConfiguration("DataBaseProvider").ToLower();11 switch (dbSavingProvider)12 {13 case "Oracle":14 iWorkflowDb = new OracleWorkFlowDBUtility();15 break;16 case "sqlserver":17 //iWorkflowDb = new SqlServerWorkFlowDBUtility();18 //break;19 default:20 iWorkflowDb = (IWorkflowDB) Assembly.Load(dbSavingProvider).CreateInstance(dbSavingProvider);21 break;22 }23 24 }25 catch (Exception)26 {27 throw new WorkFlowConfigurationNotImplementException("數據庫配置失敗!");28 }29 30 IWorkflowMethods iWorkflowMethods;31 try32 {33 string dbInterface = WorkFlowUtility.GetConfiguration("WorkflowConfigurationNameSpace");34 iWorkflowMethods = (IWorkflowMethods)Assembly.Load(dbInterface).CreateInstance(dbInterface + ".WorkflowConfiguration");35 }36 catch (Exception ex)37 {38 throw new WorkFlowConfigurationNotImplementException("應用程序實例配置失敗!");39 }40 41 return new WorkflowService(iWorkflowDb, iWorkflowMethods);42 }View Code
所有方法返回的類型都是WorkflowServiceResponse類型,該類定義如下:
1 public class WorkflowServiceResponse 2 { 3 public WorkflowServiceResponse() 4 { 5 Success = false; 6 } 7 public bool Success { get; set; } 8 public string Message { get; set; } 9 public dynamic ReturnEntity { get; set; }10 }
使用了Request-Response模式,其中返回的實體使用了.net4.0新增的Dynamic類型,這樣就不用做抽象類,然后各種不同的返回類型來繼承基類了。
調用的方法如下:
1 var wfs = WorkflowService.GetWorkflowService();2 var wfsr = wfs.GetFlowById(flowId);3 if (!wfsr.Success)4 {5 this.ShowAndRedirects("參數錯誤", "FlowManager.aspx");6 return;7 }8 var flow = wfsr.ReturnEntity as Flow;9 .......
那GetFlowById是怎么寫的呢?
1 /// <summary> 2 /// 根據流程Id得到一個流程的情況 3 /// </summary> 4 /// <param name="flowId"></param> 5 /// <returns></returns> 6 public WorkflowServiceResponse GetFlowById(Guid flowId) 7 { 8 var wfsr = new WorkflowServiceResponse(); 9 try10 {11 var flow = _iWorkflowDb.GetFlows().SingleOrDefault(f => f.FlowId == flowId);12 if (flow != null)13 {14 wfsr.ReturnEntity = flow;15 wfsr.Success = true;16 }17 }18 catch (Exception ex)19 {20 wfsr.Message = ex.ToString();21 }22 return wfsr;23 }
這樣前后端都串起來了。
在IWorkflowDB接口定義里,GetFlows返回的是List<Flow>對象,所以這么做數據接口存在一定的性能問題,如果改成IQueryable<Flow>就能夠返回Linq表達式,實現Lazy-Loaing的模式,但是Oracle不支持Linq查詢,以后換EF看看......
大家注意到了WorkflowService類里面還有個IWorkflowMethods接口。對了,這個接口就是和其它系統交互的關鍵,定義如下:
1 public interface IWorkflowMethods2 {3 Person GetCurrentLoginPerson();4 IList<Person> GetPersonByCondition(SearchCriteria searchCriteria);5 bool SendMail(Person person, string message);6 bool SendMessage(Person person, string message);7 string GetAutoCompleteValueByType(string autoCompleteType);8 IList<string> GetUserRoleGroupNames(Person person);9 }
這些方法分別是獲取當前登錄用戶、根據條件獲取應該審核流程的用戶、調用原系統方法法郵件、發短信,用于表單處理中的自動填入用戶姓名、職務等,獲取用戶所在的組(有些流程只有特定組可以申請)。
在其中一個系統中的實現方法如下:
1 public IList<Person> GetPersonByCondition(SearchCriteria searchCriteria) 2 { 3 var flowLaunchPerson = searchCriteria.FlowLaunchPerson; 4 string sql = string.Empty; 5 IList<Person> persons = new List<Person>(); 6 switch (searchCriteria.NextPersonWorkGroupName) 7 { 8 case ".....": 9 break;10 case "xxx審核":11 {12 sql = string.Format(" jsgh in (select gh from VM_TUAN....ERGR where zbid in" +13 " (select zbid from TUA....ELATIONSHip where gh = '{0}' or xh = '{0}')" +14 " and lv = 4 and zwname = '輔導員)') ", flowLaunchPerson.PersonId);15 break;16 }17 case ".....審核":18 {19 sql = string.Format(" jsgh in (select gh from VM.....HERGR where zbid in" +20 " (select zbid from TUA....IONSHIP where gh = '{0}' or xh = '{0}')" +21 " and lv = 4 and zwname = '...') ", flowLaunchPerson.PersonId); 22 break;23 };24 case ".....審核":25 ........26 break;27 default:28 break;29 }30 31 var teachers = new B.....GetModelList(sql);32 33 if (teachers.Count > 0)34 {35 foreach (var teacher in teachers)36 {37 Person person = new Person()38 {39 PersonId = teacher.....,40 PersonName = teacher.J....,41 PersonEmail = teacher.E....,42 };43 persons.Add(person);44 }45 }46 else47 {48 throw new WorkFlowAuditPersonNotFoundException("沒有找到審核對象!");49 }50 return persons;51 }View Code
最后分享服務類中兩個核心的方法
新建流程:
1 /// <summary> 2 /// 根據流程Id建立新的流程 3 /// </summary> 4 /// <param name="workflowAddStepParameter"></param> 5
新聞熱點
疑難解答