在上篇文章介绍了在MOSS中设计工作流的三种途径和层次。现在介绍下怎样在VS里开发自定义的工作流,并部署到MOSS站点上。
开发环境:
Visual Studio 2005
.Net Framework 3.0
Visual Studio 2005 Extensions for WWF
下面是一个实现多人文档审批工作流Demo
源代码下载
工作流表单设计
用Infopath简单设计俩个表单:
表单的控件名必须保持与开发时写代码用到的名称一样
工作流开发实现
1. 新建工作流项目
在这项目中我们选择SharePoint Server 顺序工作流
DeploymentFiles 文件夹下存放着工作流的描述文件和部署用到的文件,在文章后面会做详细介绍.
2. 工作流设计
用设计界面画出文档审批工作流的流程图
所有SharePoint工作流都必须从onWorkflowActivated这个活动开始,且一个工作流中只能有一个onWorkflowActivated活动
3. 实现代码逻辑
Workflow1.cs
//工作流启动初始化
private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
{
this.workflowId = workflowProperties.WorkflowId;
itemtitle = workflowProperties.Item.DisplayName;
//序列化InfoPath表单文件 *.xsn
XmlSerializer myserializer = new XmlSerializer(typeof(myFields));
XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(workflowProperties.InitiationData));
myFields myinitf = (myFields)myserializer.Deserialize(reader);
assignto = myinitf.assignees;//set the value from init form
instructions = myinitf.instructions;
}
private void workflownotFinished(object sender, ConditionalEventArgs e)
{
//判断审批流程是否结束
if (this.assignto.Split(Convert.ToChar(";")).Length < currentreviewer + 1)
{
e.Result = false;
}
else
{
e.Result = true;
}
}
private void taskNotFinished(object sender, ConditionalEventArgs e)
{
e.Result = !isFinished;
}
private void createTask1_MethodInvoking(object sender, EventArgs e)
{
TaskId = Guid.NewGuid();
isFinished = false;//task finished flag
TaskProps.Title = "Please review:" + itemtitle;
TaskProps.AssignedTo = this.assignto.Split(Convert.ToChar(";"))[this.currentreviewer].ToString();
TaskProps.Description = this.instructions;
TaskProps.ExtendedProperties["instructions"] = instructions;
}
private void onTaskChanged1_Invoked(object sender, ExternalDataEventArgs e)
{
this.isFinished = bool.Parse(AfterProps.ExtendedProperties["isFinished"].ToString());
this.comments = AfterProps.ExtendedProperties["comments"].ToString();
}
private void completeTask1_MethodInvoking(object sender, EventArgs e)
{
this.currentreviewer++;//流程转入下一个审批者
}
4. 工作流部署与调试
关于部署的文件Feature.xml, Workflow.xml
1) Feature.xml 在MOSS中,工作流是作为MOSS的Feature存在的,具体使用时再关联到具体的某个List,Library 或者 Content type中并创建实例运行的。可以参照"%Program Files%\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES" 这个目录下的Feature写这xml文件
Feature.xml
<Feature Id="61d314ee-708a-4d0b-886d-5de1880fd602"
Title="MutilReview"
Description="Mutil Users Review"
Version="12.0.0.0"
Scope="Site"
ReceiverAssembly="Microsoft.Office.Workflow.Feature, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
ReceiverClass="Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="workflow.xml" />
</ElementManifests>
<Properties>
<Property Key="GloballyAvailable" Value="true" />
<!-- Value for RegisterForms key indicates the path to the forms relative to feature file location -->
<!-- if you don't have forms, use *.xsn -->
<Property Key="RegisterForms" Value="*.xsn" />
</Properties>
</Feature>
2) Workflow.xml 工作流描述文件,部署后会同Feature.xml,以及表单文件*.xsn一同被copy到"%Program Files%\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES" 这个目录下
Workflow.xml
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Workflow
Name="MutilReview"
Description="Mutil Users Review"
Id="3ab82386-1be3-491e-8095-198bc74ddcc8"
CodeBesideClass="DemoReview.Workflow1"
CodeBesideAssembly="DemoReview, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3e5215b99aaef52f"
TaskListContentTypeId="0x01080100C9C9515DE4E24001905074F980F93160"
InstantiationUrl="_layouts/IniWrkflIP.aspx"
ModificationUrl="_layouts/ModWrkflIP.aspx">
<Categories/>
<!-- Tags to specify InfoPath forms for the workflow; delete tags for forms that you do not have -->
<MetaData>
<Instantiation_FormURN>urn:schemas-microsoft-com:office:infopath:InitForm:-myXSD-2008-03-04T07-56-37</Instantiation_FormURN>
<Association_FormURN>urn:schemas-microsoft-com:office:infopath:InitForm:-myXSD-2008-03-04T07-56-37</Association_FormURN>
<Task0_FormURN>urn:schemas-microsoft-com:office:infopath:TaskEdit:-myXSD-2008-03-04T09-04-20</Task0_FormURN>
<StatusPageUrl>_layouts/WrkStat.aspx</StatusPageUrl>
</MetaData>
</Workflow>
</Elements>
简单的说工作流的部署就是完成了这么俩个步骤
1. 注册程序集到GAC
2. 创建新的MOSS Feature绑定到相应工作流
工作流的调试我们可以把它附加到w3wp进程进行调试。
给项目强名称编译并成功部署之后,我们就可以在MOSS上运用在VS中开发的工作流了。状态机工作流的开发和这相同.