惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Google Online Security Blog
Google Online Security Blog
Engineering at Meta
Engineering at Meta
U
Unit 42
Security Latest
Security Latest
G
Google Developers Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
D
Docker
T
Tailwind CSS Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
云风的 BLOG
云风的 BLOG
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
S
Security Affairs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
N
News and Events Feed by Topic
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
S
Securelist
IT之家
IT之家
P
Palo Alto Networks Blog
D
DataBreaches.Net
Help Net Security
Help Net Security
N
Netflix TechBlog - Medium
B
Blog RSS Feed
AWS News Blog
AWS News Blog
Scott Helme
Scott Helme
爱范儿
爱范儿
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
I
Intezer
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
Microsoft Security Blog
Microsoft Security Blog
人人都是产品经理
人人都是产品经理
G
GRAHAM CLULEY
N
News | PayPal Newsroom
博客园 - 三生石上(FineUI控件)
A
Arctic Wolf
F
Fortinet All Blogs
The Register - Security
The Register - Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园 - 【当耐特】

博客园 - chegan

历时半年,我将一个大型asp.net的零代码快速开发平台转成了java 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析(三)--一个综合的例子 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析(二)-数据结构和代码分析方法 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析 像纸质笔记本一样给div,textarea添加行的分割线 基于视图的增删改查操作(颠覆传统思维吧) 恶劣的百度推广人员 javascript实现当前页面截屏 基于数据库的企业级智能表单系统设计(asp.net)-架构 基于数据库的企业级智能表单系统设计(asp.net)-序言 同时运行qq和360的方法(偶然发现的) http编程中的get和post混合使用方式 使用silverlight构建一个工作流设计器(二十一)-增加标签(下) 使用silverlight构建一个工作流设计器(二十)-增加标签(上) 自贺获得DEV-WOW 2009微软开发者大赛开发奖 使用silverlight构建一个工作流设计器(十九)-规则与活动的交点的平滑移动 使用silverlight构建一个工作流设计器(十七)-持久化数据到数据库—设计webservices接口 使用silverlight构建一个工作流设计器(十六)-持久化数据到数据库—数据库结构 抛论妄自菲薄与夜郎自大之砖,引国家软件发展道路之玉
使用silverlight构建一个工作流设计器(十八)-持久化数据到数据库—服务器段功能实现
chegan · 2009-06-29 · via 博客园 - chegan

源代码下载:http://www.shareidea.net/opensource.htm

在线演示:http://www.shareidea.net/workflow.htm

视频教程: http://www.shareidea.net/video/sharedesigner/sharedesigner.html

QQ群:85444465 

本文系列索引:   

使用silverlight构建一个工作流设计器(一)

使用silverlight构建一个工作流设计器(二)

使用silverlight构建一个工作流设计器(三)

使用silverlight构建一个工作流设计器(四)

使用silverlight构建一个工作流设计器(五)

使用silverlight构建一个工作流设计器(六)

使用silverlight构建一个工作流设计器(七)

使用silverlight构建一个工作流设计器(八)

使用silverlight构建一个工作流设计器(九)

使用silverlight构建一个工作流设计器(十)  

使用silverlight构建一个工作流设计器(十一)  

使用silverlight构建一个工作流设计器(十二)  

使用silverlight构建一个工作流设计器(十三)  

使用silverlight构建一个工作流设计器(十四)  

使用silverlight构建一个工作流设计器(十五)    

使用silverlight构建一个工作流设计器(十六) 

使用silverlight构建一个工作流设计器(十七) 

使用silverlight构建一个工作流设计器(十八) 

十八、保存到数据库服务器段功能实现

17.3 服务器端代码实现

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

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

 

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

l         获取工作流xml描述

/// <summary>

        /// 获取工作流xml描述

        /// </summary>

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

        /// <returns></returns>

        [WebMethod]

        public string GetWorkFlowXML(string workflowID)

        {

            string xml = "";

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

            { 

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

                if (process != null)

                    xml = process.WorkFlowXML;

            } 

            return xml;

        }

l         更新工作流xml描述

/// <summary>

        /// 更新流程xml

        /// </summary>

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

        [WebMethod]

        public void UpdateWorkFlowXML(string workFlowXml)        {  

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

                WorkFlow_Process process = new WorkFlow_Process(); 

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

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

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

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

                process.WorkFlowXML = workFlowXml;

                deleteExistsWorkFlow(process.WorkFlowID);

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

                foreach (XElement node in partNos)

                { 

                    WorkFlow_Activity activity = new WorkFlow_Activity();

                    process.WorkFlow_Activities.Add(activity);

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

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

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

                } 

                dataContext.WorkFlow_Processes.InsertOnSubmit(process);  

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

                WorkFlow_Rule rule = null;

                foreach (XElement node in partNos)

                {                    rule = new WorkFlow_Rule();

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

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

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

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

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

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

                    dataContext.WorkFlow_Rules.InsertOnSubmit(rule);

                }

                dataContext.SubmitChanges();

            }

        }

17.5 增加子流程的选择

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

其中获取子流程的服务方法如下所示:

[WebMethod]

        public string GetWorkFlowList()

        {

            string xml = "";

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

            {

                try

                {

                    XDocument doc = new XDocument(

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

                               select (new XElement("WorkFlow",

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

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

                    xml = doc.ToString(); 

                }

                catch (Exception e)

                {

                    xml = "";

                }

            }

            return xml;        }

客户端获取流程并显示的方法如下: 

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

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

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

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

            cbSubFlowList.ItemsSource = partNos;

            cbSubFlowList.SelectedIndex = 0;

其中WorkflowListItem是一个类,定义如下:

public class WorkflowListItem

        {

            public string Name { get; set; }

            public string ID { get; set; }

            public WorkflowListItem()         {     }

            public WorkflowListItem(string name, string id)

            {

                Name = name;

                ID = id;

            }

        }

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

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