WF培训课堂笔记
EKING <st1:chsdate month="7" islunardate="False" day="30" year="2007" w:st="on" isrocdate="False">2007-07-30</st1:chsdate>
<o:p> </o:p>
<o:p> 因项目工作流平台的选型需要,近日部门邀请微软培训讲师徐晓卓老师给我们作了2天的微软工作流平台的全面介绍与技术培训。</o:p>
技术选取的准则:
1.成熟的技术
2.主流的技术
3.熟悉的技术
<o:p> </o:p>
<o:p> </o:p>
软件发展的三个阶段:
面向对象 OO
面向组件 Component (事件驱动:事件,代理,委托)
面向服务 SOA (Saas)
<o:p> </o:p>
Application Block
<st1:place w:st="on"><st1:city w:st="on">Enterprise</st1:city></st1:place> Library
Software Factory
<o:p> </o:p>
数据库表主键:推荐用Guid (128位字符),在SQL SERVER 中字段默认值 使用内建函数 newid()
好处:数据整合时主键不会重复
工作流运行环境:
1. .net framework 3.0 (2.0的扩展版本)
前提:必修安装.net framework 2.0
2. VS2005 SP1
3. Workflow foundation
<o:p> </o:p>
序列图:有向无环图
状态图:可以有环
<o:p> </o:p>
工作流开发实例
1. HelloWorldWorkFlow
基本顺序工作流,包括工作流初始化参数
包括2个项目:HelloWorldWorkflow, WindowsApplication1
2. ExpenceWorkFlows
包括5个项目:
Activities :自定义活动
Services: 外部服务
Host: 宿主程序,服务端
Application:客户端调用程序 (.net remoting调用)
Workflows:工作流
3. Custom Activity
1) 自定义属性
2) 自组合活动
4. Host Workflow
1) WorkflowRuntime的生命周期
Start
Load, Unload, Persiste<o:p></o:p>
Stop, Complete, Teminate<o:p></o:p>
Suspend, Resume<o:p></o:p>
Idle
<o:p> </o:p>
2) GetInstanceTrackingEvents(Guid instanceId)在何时被调用?
<o:p> </o:p>
5. State Machine Activity
有环的情况
6. WebService
7.改变工作流的结构
static void modifyWorkflowFromHost(WorkflowInstance workflowInstance)<o:p></o:p>
{<o:p></o:p>
if (!workflowUpdated)<o:p></o:p>
{<o:p></o:p>
workflowUpdated = true;<o:p></o:p>
<o:p> </o:p>
Activity workflowInstanceDefinition = workflowInstance.GetWorkflowDefinition();<o:p></o:p>
WorkflowChanges workflowChangesToMake = new WorkflowChanges(workflowInstanceDefinition); //WorkflowChanges用来改变工作流结构<o:p></o:p>
<o:p> </o:p>
// remove ifelse<o:p></o:p>
Console.WriteLine("\tHost change to always require approval for");<o:p></o:p>
Console.WriteLine("\tInstanceId: " + workflowInstance.InstanceId);<o:p></o:p>
<o:p> </o:p>
CompositeActivity ifelse = workflowChangesToMake.TransientWorkflow.Activities["ifElse1Activity"] as CompositeActivity;<o:p></o:p>
workflowChangesToMake.TransientWorkflow.Activities.Remove(ifelse);<o:p></o:p>
<o:p> </o:p>
// setup to invoke NewStepWorkflow type<o:p></o:p>
InvokeWorkflowActivity invokeNewStepWorkflow = new InvokeWorkflowActivity();<o:p></o:p>
invokeNewStepWorkflow.Name = "AddNewStepWorkflow";<o:p></o:p>
invokeNewStepWorkflow.TargetWorkflow = typeof(DynamicUpdateInWorkflow.Workflow2);<o:p></o:p>
<o:p> </o:p>
// insert approval workflow<o:p></o:p>
workflowChangesToMake.TransientWorkflow.Activities.Insert(1, invokeNewStepWorkflow);<o:p></o:p>
<o:p> </o:p>
// apply transient changes to instance<o:p></o:p>
workflowInstance.ApplyWorkflowChanges(workflowChangesToMake);<o:p></o:p>
}<o:p></o:p>
else<o:p></o:p>
{<o:p></o:p>
Console.WriteLine("\tWorkflow has already been updated by the Host");<o:p></o:p>
}<o:p></o:p>
}
www.dinnernew.net : 大型分布式应用的例子,食品方面,里面有很多新技术(工作流,mmc)
CD C:\WINDOWS\assembly
CD assembly
Dir 可以看到所有共享的程序集目录
<o:p> </o:p>
<o:p> </o:p>
网络安全 多重身份认证(一般三选二)
1) 我知道什么:用户名,密码
2) 我有什么:身份卡 (如微软使用 SmartClient)
3) 我是什么: 生物技术(指纹技术)
<o:p> </o:p>
微软外部员工登陆内部系统:用户名/密码 + SmartClient
VPN + SSL
<o:p> </o:p>
<o:p> </o:p>
日志
1. 四个级别:Error, Warning, Info, Verbose
2. 一定要有日志开关,并且各个级别都要做开关
<o:p> </o:p>
分布式系统架构设计
VS2005 : 新建-〉项目-〉分布式系统架构
<v:shapetype o:spt="75" coordsize="21600,21600" stroked="f" id="_x0000_t75" filled="f" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path gradientshapeok="t" o:extrusionok="f" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape type="#_x0000_t75" id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 220.5pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:title=""></v:imagedata></v:shape>
<o:p> </o:p>
<o:p> </o:p>
<v:shape type="#_x0000_t75" id="_x0000_i1026" style="WIDTH: 414.75pt; HEIGHT: 210.75pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.png" o:title=""></v:imagedata></v:shape>
<o:p> </o:p>
<o:p> </o:p>
<v:shape type="#_x0000_t75" id="_x0000_i1027" style="WIDTH: 414.75pt; HEIGHT: 215.25pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.png" o:title=""></v:imagedata></v:shape>
课堂问题
1. 经常出现 “Error loading workflow”,是什么问题? (查看xoml文件?)
2. 工作流页面定向的URL在哪里可以设置?
3. 使用DataSet进行批量数据处理:插入,更新,删除。减少数据库的往返层次和打开关闭的次数。
4. 安全问题考虑:最小权限原则,连接字符串的加密原则。
5. SQL SERVER 2005 内建对 .net2.0 clr的支持
将dll安装到SQL SERVER ,触发器里可以直接调用dll中的方法。 <o:p></o:p>