上一篇:使用silverlight构建一个工作流设计器(十七)-持久化数据到数据库—设计webservices接口

十八、保存到数据库—服务器段功能实现
 
17.3 服务器端代码实现

服务器端的功能是将数据保存到数据库,以及从数据库中取出xml描述文件返回给客户端。本文使用LINQ to Sql Classes的方法对数据库进行操作。如下图所示,增加一个linq的类

附件: workflowdesigner_18.jpg

然后在左边的数据库链接管理器中,增加一个数据库链接,如下图所示:

附件: workflowdesigner_19.jpg

剩下的工作就是编写更新和获取工作流xml描述的代码了。


  • 获取工作流xml描述
    1. /// <summary>

    2.         /// 获取工作流xml描述

    3.         /// </summary>

    4.         /// <param name="workflowID">流程ID</param>

    5.         /// <returns></returns>

    6.         [WebMethod]

    7.         public string GetWorkFlowXML(string workflowID)

    8.         {

    9.             string xml = "";

    10.             using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = new WorkFlowDataContext())

    11.             {

    12.                 WorkFlow_Process process = dataContext.WorkFlow_Processes.First(p => p.WorkFlowID == workflowID);

    13.                 if (process != null)

    14.                     xml = process.WorkFlowXML;

    15.             }

    16.             return xml;

    17.         }
    复制代码
  • 更新工作流xml描述
    1. /// <summary>

    2.         /// 更新流程xml

    3.         /// </summary>

    4.         /// <param name="workFlowXml">流程xml描述</param>

    5.         [WebMethod]

    6.         public void UpdateWorkFlowXML(string workFlowXml)        { 

    7.             using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = new WorkFlowDataContext())            {

    8.                 WorkFlow_Process process = new WorkFlow_Process();

    9.                 Byte[] b = System.Text.UTF8Encoding.UTF8.GetBytes(workFlowXml);

    10.                 XElement xele = XElement.Load(System.Xml.XmlReader.Create(new MemoryStream(b)));

    11.                 process.WorkFlowName = xele.Attribute(XName.Get("Name")).Value;

    12.                 process.WorkFlowID = xele.Attribute(XName.Get("UniqueID")).Value;

    13.                 process.WorkFlowXML = workFlowXml;

    14.                 deleteExistsWorkFlow(process.WorkFlowID);

    15.                 var partNos = from item in xele.Descendants("Activity") select item;

    16.                 foreach (XElement node in partNos)

    17.                 {

    18.                     WorkFlow_Activity activity = new WorkFlow_Activity();

    19.                     process.WorkFlow_Activities.Add(activity);

    20.                     activity.ActivityID = node.Attribute(XName.Get("UniqueID")).Value;

    21.                     activity.ActivityName = node.Attribute(XName.Get("ActivityName")).Value;

    22.                     activity.ActivityType = node.Attribute(XName.Get("Type")).Value;

    23.                 }

    24.                 dataContext.WorkFlow_Processes.InsertOnSubmit(process); 

    25.                 partNos = from item in xele.Descendants("Rule") select item;

    26.                 WorkFlow_Rule rule = null;

    27.                 foreach (XElement node in partNos)

    28.                 {                    rule = new WorkFlow_Rule();

    29.                     rule.BeginActivityID = node.Attribute(XName.Get("BeginActivityUniqueID")).Value;

    30.                     rule.Condition = node.Attribute(XName.Get("RuleCondition")).Value;

    31.                     rule.EndActivityID = node.Attribute(XName.Get("EndActivityUniqueID")).Value;

    32.                     rule.RuleID = node.Attribute(XName.Get("UniqueID")).Value;

    33.                     rule.RuleName = node.Attribute(XName.Get("RuleName")).Value;

    34.                     rule.RuleType = node.Attribute(XName.Get("LineType")).Value;

    35.                     dataContext.WorkFlow_Rules.InsertOnSubmit(rule);

    36.                 }

    37.                 dataContext.SubmitChanges();

    38.             }

    39.         }
    复制代码
17.4 增加子流程的选择

有了以上的基础,我们可以在活动属性中设置子流程了。如下图所示:

附件: workflowdesigner_20.jpg

其中获取子流程的服务方法如下所示:
  1. [WebMethod]

  2.         public string GetWorkFlowList()

  3.         {

  4.             string xml = "";

  5.             using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = new WorkFlowDataContext())

  6.             {

  7.                 try

  8.                 {

  9.                     XDocument doc = new XDocument(

  10.     new XElement("WorkFlows", from p in dataContext.WorkFlow_Processes

  11.                               select (new XElement("WorkFlow",

  12.                                       new XAttribute("Name", p.WorkFlowName),

  13.                                       new XAttribute("ID", p.WorkFlowID)))));

  14.                     xml = doc.ToString();

  15.                 }

  16.                 catch (Exception e)

  17.                 {

  18.                     xml = "";

  19.                 }

  20.             }

  21.             return xml;        }
复制代码
客户端获取流程并显示的方法如下:
  1. Byte[] b = System.Text.UTF8Encoding.UTF8.GetBytes(xml);

  2.             XElement xele = XElement.Load(System.Xml.XmlReader.Create(new MemoryStream(b)));

  3.             var partNos = from item in xele.Descendants("WorkFlow")

  4.                           select new WorkflowListItem { Name = item.Attribute("Name").Value, ID = item.Attribute("ID").Value };

  5.             cbSubFlowList.ItemsSource = partNos;

  6.             cbSubFlowList.SelectedIndex = 0;
复制代码
其中WorkflowListItem是一个类,定义如下:
  1. public class WorkflowListItem

  2.         {

  3.             public string Name { get; set; }

  4.             public string ID { get; set; }

  5.             public WorkflowListItem()        {    }

  6.             public WorkflowListItem(string name, string id)

  7.             {

  8.                 Name = name;

  9.                 ID = id;

  10.             }

  11.         }
复制代码
从上面的代码可以看出,使用.net framework确实可以提高我们的开发效率,并且代码更加简洁。

到此我们的持久化工作已经完成了,但是距离一个可用的工作流设计器还有一定距离。因为还没有关于工作流属性的配置信息,因为工作流系统各家的实现方法都不一样。因此很难有一个统一的标准,后文将根据wfmc提供的工作流参考模型来具体实现剩下的工作。敬请关注。(文/chegan

下一篇:使用silverlight构建一个工作流设计器(十九)-规则与活动的交点的平滑移动

源码下载
TOP