在上一篇文章里面,我发布了一个SharePoint的Workflow引擎。其中提到了用户可以根据自己的要求,自己定制需要的流程动作,并插入到流程定义文件中。这篇文章演示了如何开发定制的流程动作:给一个指定的Email地址发送一封邮件,告知有新的报告来了。
打开VS.NET,新建一个“类库”项目,在项目中加入两个Assembly的引用:Kaneboy.SPSWorkflow.dll和Microsoft.SharePoint.dll。
编写自定义流程动作,其实就是创建一个从Kaneboy.SPSWorkflow.Actions.ActionBase继承下来的类,并override继承的DoAction()方法。
Kaneboy.SPSWorkflow.Actions.ActionBase提供了多个protected的属性,这些属性公开了与这个流程动作相关的一些信息:
Web : 当前的SPS站点
List : 当前这个文件所在的文档库
User : 执行这个动作的用户
File : 当前的文件
ListItem : 当前文件相关的列表项
Parameter : 从流程定义文件中传入的参数的值,比如流程定义文件中对于这个动作的定义是“<action ns="Tencent" prefix="st1" Assembly="”C:/SPSWorkflowActionSample.dll” Type=”SPSWorkflowActionSample.SendEmail” Parameter=”kaneboy@kaneboy.com” />”,那么这里的Parameter属性值就是“kaneboy@kaneboy.com”
现在开始创建这个流程动作类:
public class SendEmail : Kaneboy.SPSWorkflow.Actions.ActionBase
然后重写父类的DoAction()方法:
public override Microsoft.SharePoint.SPFile DoAction()
{
MailMessage mailMsg = new MailMessage();
// 邮件的发件信箱就是当前用户的Email,这个Email是SPS站点用户的信箱
mailMsg.From = this.User.Email;
// 邮件的收件信箱从动作参数中获得
mailMsg.To = this.Parameter;
// 邮件的主题和正文从当前用户和当前文件中获得相应信息
mailMsg.Subject = this.User.Name + "提交了一篇新的报告:" + this.File.Name;
mailMsg.Body = mailMsg.Subject;
try
{
// 这个例子假设可以在本机通过CDOSYS发送邮件
SmtpMail.SmtpServer = "127.0.0.1";
SmtpMail.Send(mailMsg);
}
finally
{
}
// 除非对当前文件做了移动操作,否则返回null即可。
return null;
}
编译,得到一个dll文件,然后将dll文件放置到SPS服务器的某个位置。参看这个流程定义文件,如果我们要在报告移到部门经理报告库后自动发送一封邮件给经理,那么在
<action Assembly="" Roman?? New ?Times mso-hansi-font-family: Roman?; mso-ascii-font-family: 宋体; FONT-FAMILY: Parameter="
<Action Assembly="" Type="Kaneboy.SPSWorkflow.Actions.Move" Parameter="部门经理报告库" />
的后面再添加一行:
<action Assembly="C:/SPSWorkflowAction
<Action Assembly="C:/SPSWorkflowActionSample.dll" Type="SPSWorkflowActionSample.SendEmail" Parameter="receiver@mail.com" />
Assembly属性的值就是编译得到的dll文件的绝对路径,Type属性的值是动作类的名称,Parameter属性的值就是收件人的信箱。
完整的项目源码点击这里下载。