通用流程设计

通用流程设计

 

  写在前面:本人文采不好,零星写过几篇随笔,但都不尽人意,本着共同学习共同进步的原则,还是打算把近期开发的一个通用流程的软件拿出来与大家分享。本流程软件能满足鄙人接触到了解到的一般的流程实现(由于接触到的流程有限,以及对流程理解的不够透彻,流程引擎中不免有设计不足或考虑不周,也希望大神们能多多指点),如果读者在阅读或使用过程中遇到什么问题或有什么想法,希望能拿出来与大家分享,我们共同去学习去完善这套流程引擎。本随笔打算只涉及流程引擎部分,可视化流程设计随后做单独的随笔推出。写作水平有限,望读者多多体谅...(如有问题可随时联系笔者。邮箱:[email protected]

  一、需求

  开发一套通用流程引擎软件,在主软件可以通过简单的注册、引用,即可完成软件流程部门的设计开发。

  二、抽象解决方案

  1.通过EntityFramework的CodeFirst实现流程有关的数据库表的创建。

  2.通过SilverLight实现流程的可视化操作。

  三、项目结构说明

 通用流程设计

  四、项目结构分析及代码

  一、Entities流程实体

  定义流程相关的数据库实体。

  通用流程设计

  1.WorkflowInitializer.cs 初始化数据库类,定义创建数据库时的默认数据。相关类定义如下:

复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Data.Entity;

 4 using System.Linq;

 5 using System.Text;

 6 using Workflow.Entities;

 7 

 8 namespace Workflow.Entities

 9 {

10     /// <summary>

11     /// 初始化数据库数据

12     /// </summary>

13     public class WorkflowInitializer : DropCreateDatabaseIfModelChanges<WorkflowDB>

14     {

15         /// <summary>

16         /// 重写数据库初始化方法

17         /// </summary>

18         /// <param name="context"></param>

19         protected override void Seed(WorkflowDB context)

20         {

21             var modules = new List<ModuleList> { 

22                 new ModuleList{ModuleName="模版一",ModuleExplain="模版一"}

23             };

24             modules.ForEach(i => context.ModuleLists.Add(i));

25             context.SaveChanges();

26 

27             var mains = new List<WorkflowMain> { 

28                 new WorkflowMain { WorkflowName = "流程一",WorkflowStatus="1",ModuleID=1,Owner="qdq",WorkflowExplain="主流程说明",IsDefault=true }

29             };

30             mains.ForEach(i => context.WorkflowMains.Add(i));

31             context.SaveChanges();

32 

33             var details = new List<WorkflowDetailed> { 

34                 new WorkflowDetailed{Top_Y=10,Left_X=10,SetpExplain="开始",StepStatus="1",Deadline=3,Nunciator="qdq",

35                     IsCirculation=false,ProcessingPersonnel="qdq",ProcessingPersonnelMode="Person",WorkflowID=1,StepID=0,

36                     StepName="开始",UpStep=null,NextStep=1,ProcessingMode="1"},

37                 new WorkflowDetailed{Top_Y=200,Left_X=200,SetpExplain="步骤一",StepStatus="1",Deadline=3,Nunciator="qdq",

38                     IsCirculation=false,ProcessingPersonnel="qdq",ProcessingPersonnelMode="Person",WorkflowID=1,StepID=1,

39                     StepName="步骤一",UpStep=-1,NextStep=2,ProcessingMode="1"},

40                 new WorkflowDetailed{Top_Y=350,Left_X=350,SetpExplain="步骤二",StepStatus="1",Deadline=3,Nunciator="qdq,cyl",

41                     IsCirculation=false,ProcessingPersonnel="qdq",ProcessingPersonnelMode="Person",WorkflowID=1,StepID=2,

42                     StepName="步骤二",UpStep=-1,NextStep=-1,ProcessingMode="1"},

43                 new WorkflowDetailed{Top_Y=500,Left_X=500,SetpExplain="结束",StepStatus="1",Deadline=3,Nunciator="qdq",

44                     IsCirculation=false,ProcessingPersonnel="qdq",ProcessingPersonnelMode="Person",WorkflowID=1,StepID=-1,

45                     StepName="结束",UpStep=null,NextStep=0,ProcessingMode="1"}

46             };

47             details.ForEach(i => context.WorkflowDetaileds.Add(i));

48             context.SaveChanges();

49 

50             var tasks = new List<TaskList> { 

51                 new TaskList{ MessageType=1,TaskSN=1,StepStatus="1",HandleType=1,HandleStatus=true,HandlePerson="qdq",

52                     HandleTime=DateTime.Now,Receive=DateTime.Now,Opinion="同意",WorkflowDetailed_ID=2,FromID="20130001"}

53             };

54             tasks.ForEach(i => context.TaskLists.Add(i));

55             context.SaveChanges();

56 

57             var annexs = new List<AnnexList> { 

58                 new AnnexList{AnnexAddress="测试",AnnexName="测试",TaskList_ID=1}

59             };

60             annexs.ForEach(i => context.AnnexLists.Add(i));

61             context.SaveChanges();

62 

63             base.Seed(context);

64         }

65     }

66 }
复制代码

  2.WorkflowDB.cs 继承System.Data.Entity.DbContext 定义流程引擎数据库上下文类。相关类定义如下:

复制代码
 1 using System.Collections.Generic;

 2 using System.Data.Entity;

 3 using System.ComponentModel.DataAnnotations;

 4 

 5 namespace Workflow.Entities

 6 {

 7     /// <summary>

 8     /// 数据上下文

 9     /// </summary>

10     public class WorkflowDB : DbContext

11     {

12         //name指定连接字符串,否则默认为类名(如果有多个连接字符串,此处选取第一个)

13         /// <summary>

14         /// 构造函数

15         /// </summary>

16         public WorkflowDB()

17         //: base("name=WorkflowDB")

18         : base("Data Source=.;Initial Catalog=WorkflowDB;User ID=sa;Password=1234;Integrated Security=True")

19         //: base("name=" + System.Configuration.ConfigurationManager.ConnectionStrings[1].Name)

20         { }

21         /// <summary>

22         /// 模块实体列表

23         /// </summary>

24         public DbSet<ModuleList> ModuleLists { get; set; }

25         /// <summary>

26         /// 流程实体列

27         /// </summary>

28         public DbSet<WorkflowMain> WorkflowMains { get; set; }

29         /// <summary>

30         /// 步骤实体列表

31         /// </summary>

32         public DbSet<WorkflowDetailed> WorkflowDetaileds { get; set; }

33         /// <summary>

34         /// 任务实体列表

35         /// </summary>

36         public DbSet<TaskList> TaskLists { get; set; }

37         /// <summary>

38         /// 附件实体列表

39         /// </summary>

40         public DbSet<AnnexList> AnnexLists { get; set; }

41     }

42 }
复制代码

  3.ModuleList.cs 模块类,主应用程序包含多个模块应用流程时,有此处区分具体模块需应用的具体流程。相关类定义如下:

复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.ComponentModel.DataAnnotations;

 4 using System.ComponentModel.DataAnnotations.Schema;

 5 using System.Linq;

 6 using System.Text;

 7 

 8 namespace Workflow.Entities

 9 {

10     public class ModuleList

11     {

12         // id标识

13         private int _ModuleID;

14         // 模块说明

15         private string _ModuleExplain;

16         /// <summary>

17         /// 所包含的流程列表

18         /// </summary>

19         public ICollection<WorkflowMain> WorkflowMains { get; set; }

20         // 模块名称

21         private string _ModuleName;

22 

23         /// <summary>

24         /// 模块名称

25         /// </summary>

26         [Required(ErrorMessage="模块名称为必填"),MaxLength(100)]

27         public string ModuleName

28         {

29             get { return _ModuleName; }

30             set { _ModuleName = value; }

31         }

32 

33         /// <summary>

34         /// 模块说明

35         /// </summary>

36         [MaxLength(500)]

37         public string ModuleExplain

38         {

39             get { return _ModuleExplain; }

40             set { _ModuleExplain = value; }

41         }

42 

43         /// <summary>

44         /// id标识

45         /// </summary>

46         [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]

47         public int ModuleID

48         {

49             get { return _ModuleID; }

50             set { _ModuleID = value; }

51         }

52 

53     }

54 }
复制代码

  4.WorkflowMain.cs 流程主表类,定义流程相关的属性。相关类定义如下:

复制代码
  1 using System.Collections.Generic;

  2 using System.Data.Entity;

  3 using System.ComponentModel.DataAnnotations;

  4 using System.ComponentModel.DataAnnotations.Schema;

  5 

  6 namespace Workflow.Entities

  7 {

  8     public partial class WorkflowMain

  9     {

 10         // 流程编号

 11         private int _WorkflowID;

 12         // 流程名称

 13         private string _WorkflowName;

 14         // 是否为默认流程

 15         private bool _IsDefault;

 16         // 流程的状态(1正常2暂停3废弃)

 17         private string _WorkflowStatus;

 18         // 流程说明

 19         private string _WorkflowExplain;

 20         // 流程所属人

 21         private string _Owner;

 22         private int _ModuleID;

 23 

 24         /// <summary>

 25         /// 流程的状态(1正常2暂停3废弃)

 26         /// </summary>

 27         [Required,MaxLength(1)]

 28         public string WorkflowStatus

 29         {

 30             get { return _WorkflowStatus; }

 31             set { _WorkflowStatus = value; }

 32         }

 33 

 34         /// <summary>

 35         /// 流程详细步骤表

 36         /// </summary>

 37         public ICollection<WorkflowDetailed> WorkflowDetaileds { get; set; }

 38 

 39         /// <summary>

 40         /// 所属模块

 41         /// </summary>

 42         [ForeignKey("ModuleID")]

 43         public ModuleList ModuleList { get; set; }

 44 

 45         /// <summary>

 46         /// 所属模块ID

 47         /// </summary>

 48         [Required]

 49         public int ModuleID

 50         {

 51             get { return _ModuleID; }

 52             set { _ModuleID = value; }

 53         }

 54         

 55         /// <summary>

 56         /// 流程所属人

 57         /// </summary>

 58         [MaxLength(20)]

 59         public string Owner

 60         {

 61             get { return _Owner; }

 62             set { _Owner = value; }

 63         }

 64 

 65         /// <summary>

 66         /// 流程说明

 67         /// </summary>

 68         [MaxLength(500)]

 69         public string WorkflowExplain

 70         {

 71             get { return _WorkflowExplain; }

 72             set { _WorkflowExplain = value; }

 73         }

 74 

 75         /// <summary>

 76         /// 流程编号

 77         /// </summary>

 78         [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]

 79         public int WorkflowID

 80         {

 81             get { return _WorkflowID; }

 82             set { _WorkflowID = value; }

 83         }

 84 

 85         /// <summary>

 86         /// 流程名称

 87         /// </summary>

 88         [Required(ErrorMessage = "流程名称为必填"),MaxLength(30)]

 89         public string WorkflowName

 90         {

 91             get { return _WorkflowName; }

 92             set { _WorkflowName = value; }

 93         }

 94 

 95         /// <summary>

 96         /// 是否为默认流程

 97         /// </summary>

 98         public bool IsDefault

 99         {

100             get { return _IsDefault; }

101             set { _IsDefault = value; }

102         }

103 

104     }

105 }
复制代码

  5.WorkflowDetailed.cs 流程子表类,定义流程步骤的相关属性。相关类定义如下:

复制代码
  1 using System.Collections.Generic;

  2 using System.Data.Entity;

  3 using System.ComponentModel.DataAnnotations;

  4 using System.ComponentModel.DataAnnotations.Schema;

  5 using System;

  6 

  7 namespace Workflow.Entities

  8 {

  9     public partial class WorkflowDetailed

 10     {

 11         public WorkflowDetailed() { }

 12 

 13         public WorkflowDetailed(int workflow, int stepid,string stepname)

 14         {

 15             _WorkflowID = workflow;

 16             _StepID = stepid;

 17             _StepName = stepname;

 18             _UpStep = -1;//默认审批不通过进入结束流程

 19             _NextStep = stepid + 1;//默认+1

 20             _ProcessingMode = "100%";

 21             //_MainProcessingMode = "100%";

 22             _ProcessingPersonnelMode = "Person";

 23             _ProcessingPersonnel = "";

 24             _IsCirculation = false;

 25             _Nunciator = "";

 26             _Deadline = 7;

 27             _StepStatus = "1";

 28         }

 29 

 30         // id标识

 31         private int _ID;

 32         // 流程编号

 33         private int _WorkflowID;

 34         // 步骤编号

 35         private int _StepID;

 36         // 步骤名称

 37         private string _StepName;

 38         // 验证失败返回的步骤,审批不同意和环形审批使用

 39         private int? _UpStep;

 40         // 验证通过进入的步骤序号

 41         private int? _NextStep;

 42         // 流程处理 验证是否通过的模式(正数=通过人数,负数=不通过人数,百分数=通过率)

 43         private string _ProcessingMode;

 44         // 处理人员的类型(人员 角色 部门等)

 45         private string _ProcessingPersonnelMode;

 46         // 处理具体人员(人员 角色 部门等)

 47         private string _ProcessingPersonnel;

 48         // 是否运行流转

 49         private bool _IsCirculation;

 50         // 具体告知人

 51         private string _Nunciator;

 52         // 告知人的过期时间 单位/天

 53         private int _Deadline;

 54         // 流程的状态(1正常2暂停3废弃)

 55         private string _StepStatus;

 56         // 条件表达式(根据条件判断下一步骤 格式如:7>@p?1:2)优先级大于NextStep

 57         private string _Conditions;

 58         // 步骤说明

 59         private string _SetpExplain;

 60         // 距离左侧的距离 X轴坐标

 61         private double? _Left_X;

 62         // 距离顶部的距离 Y轴坐标

 63         private double? _Top_Y;

 64 

 65         /// <summary>

 66         /// 距离顶部的距离 Y轴坐标

 67         /// </summary>

 68         public double? Top_Y

 69         {

 70             get { return _Top_Y; }

 71             set { _Top_Y = value; }

 72         }

 73 

 74         /// <summary>

 75         /// 距离左侧的距离 X轴坐标

 76         /// </summary>

 77         public double? Left_X

 78         {

 79             get { return _Left_X; }

 80             set { _Left_X = value; }

 81         }

 82 

 83         /// <summary>

 84         /// 任务列表

 85         /// </summary>

 86         public ICollection<TaskList> TaskLists { get; set; }

 87         /// <summary>

 88         /// 流程主表

 89         /// </summary>

 90         [ForeignKey("WorkflowID")]

 91         public WorkflowMain WorkflowMain { get; set; }

 92 

 93         /// <summary>

 94         /// 步骤说明

 95         /// </summary>

 96         [MaxLength(500)]

 97         public string SetpExplain

 98         {

 99             get { return _SetpExplain; }

100             set { _SetpExplain = value; }

101         }

102 

103         /// <summary>

104         /// 条件表达式(根据条件判断下一步骤 格式如:7>@p?1:2)优先级大于NextStep

105         /// </summary>

106         [MaxLength(100)]

107         public string Conditions

108         {

109             get { return _Conditions; }

110             set { _Conditions = value; }

111         }

112 

113         /// <summary>

114         /// 流程的状态(1正常2暂停3废弃)

115         /// </summary>

116         [Required,MaxLength(1)]

117         public string StepStatus

118         {

119             get { return _StepStatus; }

120             set { _StepStatus = value; }

121         }

122 

123 

124         /// <summary>

125         /// 告知人的过期时间 单位/天

126         /// </summary>

127         public int Deadline

128         {

129             get { return _Deadline; }

130             set { _Deadline = value; }

131         }

132 

133         /// <summary>

134         /// 具体告知人

135         /// </summary>

136         [MaxLength(500)]

137         public string Nunciator

138         {

139             get { return _Nunciator; }

140             set { _Nunciator = value; }

141         }

142 

143         /// <summary>

144         /// 是否运行流转

145         /// </summary>

146         public bool IsCirculation

147         {

148             get { return _IsCirculation; }

149             set { _IsCirculation = value; }

150         }

151 

152         /// <summary>

153         /// 处理具体人员(人员 角色 部门等)

154         /// </summary>

155         [MaxLength(500)]

156         public string ProcessingPersonnel

157         {

158             get { return _ProcessingPersonnel; }

159             set { _ProcessingPersonnel = value; }

160         }

161 

162         /// <summary>

163         /// 处理人员的类型(人员 角色 部门等)

164         /// </summary>

165         [Required(ErrorMessage = "处理人员的类型为必填"), MaxLength(100)]

166         public string ProcessingPersonnelMode

167         {

168             get { return _ProcessingPersonnelMode; }

169             set { _ProcessingPersonnelMode = value; }

170         }

171 

172         /// <summary>

173         /// id标识

174         /// </summary>

175         [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]

176         public int ID

177         {

178             get { return _ID; }

179             set { _ID = value; }

180         }

181 

182         /// <summary>

183         /// 流程编号

184         /// </summary>

185         [Required]

186         public int WorkflowID

187         {

188             get { return _WorkflowID; }

189             set { _WorkflowID = value; }

190         }

191 

192         /// <summary>

193         /// 步骤编号

194         /// </summary>

195         [Required(ErrorMessage="步骤编号")]

196         public int StepID

197         {

198             get { return _StepID; }

199             set { _StepID = value; }

200         }

201 

202         /// <summary>

203         /// 步骤名称

204         /// </summary>

205         [Required(ErrorMessage="步骤名称"),MaxLength(30)]

206         public string StepName

207         {

208             get { return _StepName; }

209             set { _StepName = value; }

210         }

211 

212         /// <summary>

213         /// 验证失败返回的步骤,审批不同意和环形审批使用

214         /// </summary>

215         public int? UpStep

216         {

217             get { return _UpStep; }

218             set { _UpStep = value; }

219         }

220 

221         /// <summary>

222         /// 验证通过进入的步骤序号

223         /// </summary>

224         public int? NextStep

225         {

226             get { return _NextStep; }

227             set { _NextStep = value; }

228         }

229 

230         /// <summary>

231         /// 流程处理验证是否通过的模式(正数=通过人数,负数=不通过人数,百分数=通过率)

232         /// </summary>

233         [Required(ErrorMessage = "通过模式为必填"),MaxLength(10)]

234         public string ProcessingMode

235         {

236             get { return _ProcessingMode; }

237             set { _ProcessingMode = value; }

238         }

239 

240     }

241 }
复制代码

  6.TaskList.cs 任务表,定义针对处理人的相关任务信息。相关类定义如下:

复制代码
  1 using System;

  2 using System.Collections.Generic;

  3 using System.ComponentModel.DataAnnotations;

  4 using System.ComponentModel.DataAnnotations.Schema;

  5 using System.Linq;

  6 using System.Text;

  7 

  8 namespace Workflow.Entities

  9 {

 10     public class TaskList

 11     {

 12         // id标识

 13         private int _ID;

 14         // 表单ID

 15         private string _FromID;

 16         // 步骤ID

 17         private int _WorkflowDetailed_ID;

 18         // 处理意见

 19         private string _Opinion;

 20         // 接收时间

 21         private DateTime _ReceiveTime;

 22         // 处理时间

 23         private DateTime? _HandleTime;

 24         // 处理人(告知人)

 25         private string _HandlePerson;

 26         // 处理状态(查看状态)

 27         private bool _HandleStatus;

 28         // 处理类型(1同意,2不同意)

 29         private int? _HandleType;

 30         // 流程状态(主要用于暂停时(1正常2暂停3废弃))

 31         private string _StepStatus;

 32         // 上层任务id

 33         private int? _UpTask;

 34         // 任务序号

 35         private int _TaskSN;

 36         // 消息类型1处理类型2告知类型

 37         private int _MessageType;

 38         /// <summary>

 39         /// 所属步骤表

 40         /// </summary>

 41         [ForeignKey("WorkflowDetailed_ID")]

 42         public WorkflowDetailed WorkflowDetailed { get; set; }

 43         /// <summary>

 44         /// 附件表

 45         /// </summary>

 46         public ICollection<AnnexList> AnnexLists { get; set; }

 47 

 48         /// <summary>

 49         /// 消息类型1处理类型2告知类型

 50         /// </summary>

 51         public int MessageType

 52         {

 53             get { return _MessageType; }

 54             set { _MessageType = value; }

 55         }

 56 

 57         /// <summary>

 58         /// 任务序号

 59         /// </summary>

 60         public int TaskSN

 61         {

 62             get { return _TaskSN; }

 63             set { _TaskSN = value; }

 64         }

 65       

 66         /// <summary>

 67         /// 上层任务id

 68         /// </summary>

 69         public int? UpTask

 70         {

 71             get { return _UpTask; }

 72             set { _UpTask = value; }

 73         }

 74         /// <summary>

 75         /// 流程状态(主要用于暂停时(1正常2暂停3废弃))

 76         /// </summary>

 77         [Required, MaxLength(1)]

 78         public string StepStatus

 79         {

 80             get { return _StepStatus; }

 81             set { _StepStatus = value; }

 82         }

 83 

 84         /// <summary>

 85         /// 处理类型(1同意,2不同意)

 86         /// </summary>

 87         public int? HandleType

 88         {

 89             get { return _HandleType; }

 90             set { _HandleType = value; }

 91         }

 92 

 93         /// <summary>

 94         /// 处理状态

 95         /// </summary>

 96         [Required]

 97         public bool HandleStatus

 98         {

 99             get { return _HandleStatus; }

100             set { _HandleStatus = value; }

101         }

102 

103         /// <summary>

104         /// 处理人

105         /// </summary>

106         [Required]

107         public string HandlePerson

108         {

109             get { return _HandlePerson; }

110             set { _HandlePerson = value; }

111         }

112 

113         /// <summary>

114         /// 处理时间

115         /// </summary>

116         public DateTime? HandleTime

117         {

118             get { return _HandleTime; }

119             set { _HandleTime = value; }

120         }

121         /// <summary>

122         /// 接收时间

123         /// </summary>

124         [Required]

125         public DateTime Receive

126         {

127             get { return _ReceiveTime; }

128             set { _ReceiveTime = value; }

129         }

130 

131         /// <summary>

132         /// 处理意见

133         /// </summary>

134         public string Opinion

135         {

136             get { return _Opinion; }

137             set { _Opinion = value; }

138         }

139 

140         /// <summary>

141         /// 步骤ID

142         /// </summary>

143         [Required]

144         public int WorkflowDetailed_ID

145         {

146             get { return _WorkflowDetailed_ID; }

147             set { _WorkflowDetailed_ID = value; }

148         }

149 

150         /// <summary>

151         /// 表单ID

152         /// </summary>

153         [Required]

154         public string FromID

155         {

156             get { return _FromID; }

157             set { _FromID = value; }

158         }

159 

160         /// <summary>

161         /// id标识

162         /// </summary>

163         [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]

164         public int ID

165         {

166             get { return _ID; }

167             set { _ID = value; }

168         }

169     }

170 }
复制代码

  7.AnnexList.cs 附件表,针对任务处理时上传附件的需求。相关类定义如下:

复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.ComponentModel.DataAnnotations;

 4 using System.ComponentModel.DataAnnotations.Schema;

 5 using System.Linq;

 6 using System.Text;

 7 

 8 namespace Workflow.Entities

 9 {

10     public class AnnexList

11     {        

12         // id标识

13         private int _ID;

14         // 所属任务表ID

15         private int _TaskList_ID;

16         // 原始附件名

17         private string _AnnexName;

18         // 附件地址

19         private string _AnnexAddress;

20         // 备注

21         private string _Remark;

22         /// <summary>

23         /// 所属的任务表

24         /// </summary>

25         [ForeignKey("TaskList_ID")]

26         public TaskList TaskList { get; set; }

27 

28         /// <summary>

29         /// 备注

30         /// </summary>

31         [MaxLength(500)]

32         public string Remark

33         {

34             get { return _Remark; }

35             set { _Remark = value; }

36         }

37 

38         /// <summary>

39         /// 附件地址

40         /// </summary>

41         [Required,MaxLength(200)]

42         public string AnnexAddress

43         {

44             get { return _AnnexAddress; }

45             set { _AnnexAddress = value; }

46         }

47 

48         /// <summary>

49         /// 原始附件名

50         /// </summary>

51         [Required,MaxLength(300)]

52         public string AnnexName

53         {

54             get { return _AnnexName; }

55             set { _AnnexName = value; }

56         }

57 

58         /// <summary>

59         /// 所属任务表ID

60         /// </summary>

61         [Required]

62         public int TaskList_ID

63         {

64             get { return _TaskList_ID; }

65             set { _TaskList_ID = value; }

66         }

67 

68         /// <summary>

69         /// id标识

70         /// </summary>

71         [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]

72         public int ID

73         {

74             get { return _ID; }

75             set { _ID = value; }

76         }

77 

78     }

79 }
复制代码

  二、Abstract 接口

  定义外部访问的接口类。

  通用流程设计

  1.ConcreteFactory.cs 工厂类,对外提供接口的实例。代码如下:

复制代码
 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 

 6 namespace Workflow.Abstract

 7 {

 8     public class ConcreteFactory

 9     {

10         /// <summary>

11         /// 创建具体实现的类的实例

12         /// </summary>

13         /// <typeparam name="T">接口类型</typeparam>

14         /// <typeparam name="T2">具体实现</typeparam>

15         /// <returns></returns>

16         public static T CreateConcrete<T,T2>() where T2:T

17         {

18             return (T)Activator.CreateInstance<T2>();

19         }

20     }

21 }
复制代码

  2.Enums.cs 定义相关的枚举。代码如下:

  Enums.cs

  3. I*Operation.cs 对应数据库表的相关操作。代码如下:

  IModuleOperation.cs
  IWorkflowMainOperation.cs
  IWorkflowDetailedOperation.cs
  ITaskListOperation.cs
  IAnnexListOperation.cs

  4.IWorkflowOperation.cs 流程的总体操作。代码如下:

  View Code

  5.IPersonList.cs 具体应用程序需实现的权限相关的人员接口。代码如下:

  View Code

  6.PersonnelMode.cs 全局角色类型,通过单例模式实现对应用程序全局人员类型的管理。代码如下:

  View Code

  三、Concrete接口的实现  

  对接口的具体实现。

  通用流程设计

  1. *Operation.cs 对应数据库表的相关操作。代码如下:

  ModuleOperation.cs
  WorkflowMainOperation.cs
  WorkflowDetailedOperation.cs
  TaskListOperation.cs
  AnnexListOperarion.cs

  2.WorkflowOperation.cs 流程的总体操作。代码如下:

  View Code

  3.PersonPersonnelMode.cs 人员类型中,人员的实现实例类。代码如下:

  View Code

  四、MyEvaluator.cs 执行表达式或方法,返回结果的类。

相关代码如下:

  MyEvaluator.cs
  五、关键技术点剖析

  1.不同的软件可能包含不同人员类型(如流程审批中可能需要组织机构中的部门经理,还可能需要角色中的计划员等)。

  解决方案:提供统一的接口(IPersonList),具体的应用程序实现接口,并在全局变量PersonnelModeList中注册接口实现类的实例。

  2.条件步骤的具体选择(如在满足条件一的情况下走步骤一,而在满足条件二的时候可能需要走步骤二)。

  解决方案:提供可行性表达式的方法,根据执行表达式的结果确定具体的步骤(如(10>@p?1:2)会根据传入的p的值确定是走步骤一还是走步骤二)。

  六、总结

  因并没有与具体的表单设计引擎相关联,流程引擎中必然存在许多不足的地方,比如,条件步骤的具体选择就存在很大的局限性,无法直接设置某个属性的值去做条件判断从而确定具体的步骤。

  由于笔者知识面的局限性,引擎中可能还存在笔者没有考虑到的因素,望读者们能与笔者共同发现引擎中的不足以及寻找最佳的解决方案。或者读者对现有的代码结构、解决方案等有好的意见均可与笔者沟通(联系方式见上)。

  注:相关源码会在下一篇的可视化流程设计中一并给出,有兴趣的读者请关注。

 
 
分类:  C#
标签:  EntityFrameworkASP.NETC#

你可能感兴趣的:(C#,asp.net,entityframework)