CRM的Workflow給咱們的流程處理帶來很多便利,可是這種自帶的Workflow並非萬能的,中間某一step不能支持,每每會牽一髮而動全身,可能形成整個Workflow Steps的從新設計。幸虧CRM還提供了其它的方案來實現這類需求,這裏要說的就是Custom Workflow Activity。ide
下面用個具體的實例來講明下,如今有Entity A,B,C,D,它們的關係是,A上有對B的Lookup字段BLookup,B上有C的Lookup字段CLookup,C上有D的Lookup字段DLookup,但願由A的某個字段的變更觸發Workflow,發送郵件,而郵件的接收人是D上的某個User字段的值。配置過Workflow的人都知道,CRM的Workflow是不能跨多層去指定這個User的,因此這裏咱們能夠藉助Custom Workflow Activity來實現。spa
首先在Visual Studio Project的配置上,Custom Workflow跟Plugin是類似的,須要額外引用一些dll,好比microsoft.xrm.sdk.workflow.dll,System.Activities.dll等設計
接着是指定類的繼承,與Plugin須要繼承IPlugin類似,這裏須要繼承CodeActivity(System.Activities.dll)3d
再而後,就是指定輸入參數和輸出參數了,畢竟咱們是要根據必定的規則去獲取最終的User。code
指定輸入參數:blog
指定輸出參數:繼承
指定輸入輸出Attribute,並使用InArgument<Type>和OutArgument<Type>,在這裏須要注意的是,Custom Workflow僅支持以下的Typeget
還有一點就是,有一些特殊的類型,須要指定額外的Attribute:EntityReference,須要指定ReferenceTarget;OptionSetValue,須要指定AttributeTarget。workflow
最後就是方法實現it
protected override void Execute(CodeActivityContext executionContext) { try { IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>(); IOrganizationServiceFactory factory = executionContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = factory.CreateOrganizationService(null); //service.Execute 獲取user ReferringOfficer.Set(executionContext, user); } catch{...} }
Project完工以後,可使用Plugin註冊Tool註冊這個,不用添加任何Step。而Debug Custom Workflow,也是跟Plugin類似的套路,這裏就再也不多贅述了。
以後就能夠在CRM自帶的Workflow->Add Step中看到這個Custom Workflow了,配置好輸入信息,並在Send Email Step中,配置返回值做爲郵件的To,就達到了咱們想要的效果了。
在使用Custom Workflow的時候,必定要注意返回值是空的狀況,畢竟咱們不能保證全部的數據都是完整的,好比D上的User是空,那麼這個時候,須要注意配置默認值,也就是我在上面截圖中的[Default]。