在上一篇文章裡面,我發布了一個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屬性的值就是收件者的信箱。
完整的項目源碼點擊這裡下載。