ここで目標を達成するのはかなり難しいかもしれませんが、簡単なことから始めましょう:-
WorkflowMarkupSerializer
名前空間で見つかったものを使用して、XOMLからワークフローを再構築できSystem.Workflow.ComponentModel.Serialization
ます。
var serializer = new WorkflowMarkupSerializer();
object root = serializer.Deserialize(myXmlReader);
同様に、を使用して、CompositeActivityから継承するもので保持されているアクティビティの「スニペット」を再構築できますCompostiteActivityMarkupSerializer
。
ただし、新しいルートアクティビティを現在実行中のワークフローに統合するには、より多くの作業が必要です。WorkflowChanges
現在のインスタンスで使用されているワークフロー定義を変更して、クラスのインスタンスを使用して新しいアクティビティを作成する必要があります。
さて、ドキュメンテーションは、この主題に関していくらか大ざっぱで、少しでも回避的です。ただし、2つの重要なポイントを収集できます。-
- 最終的にはへの呼び出し
ApplyWorkflowChanges
が必要であり、このメンバーはprotected
アクセス可能です。
- ドキュメントは、これがワークフローのルートアクティビティで発生する必要があることを示しています。
したがって、少なくともこの要件を支援するには、カスタムルートアクティビティが必要であると推測できます。
これを構造化する方法はおそらく他にもありますがSequenceActivity
、ワークフローの変更を実行するカスタムの「InvokeWorkflow」アクティビティがあり、結果の新しいアクティビティをこの包含シーケンスの最後に配置する予定であると仮定します。
まず、カスタムルートアクティビティに実装できるインターフェイス定義が必要です。-
internal interface IModifiableWorkflow
{
void ApplyWorkflowChanges(WorkflowChanges workflowChanges);
}
カスタムルートアクティビティでは、このインターフェイスを明示的に実装します。-
public class CustomSequentialActivity : SequentialWorkflowActivity, IModifiableWorkflow
{
void IModifiableWorkflow.ApplyWorkflowChanges(WorkflowChanges workflowChanges)
{
base.ApplyWorkflowChanges(workflowChanges);
}
}
Execute
カスタムの「InvokeWorkflow」アクティビティのメソッド:-
// Get root activity
var root = this.Parent;
while (root.Parent != null) { root = root.Parent; }
// Create an instance of WorkflowChanges based on the root activity
var changes = new WorkflowChanges(root);
//Find the parent sequence activity in the transient workflow definition
var target = changes.TransientWorkflow.GetActivityByName(this.Parent.Name);
Activity newActivity = YourCodeToLoadActivityDetailsFromXoml();
target.Activities.Add(newActivity);
//Apply the new changes
((IModifiableWorkflow)root).ApplyWorkflowChanges(changes);
私は実際にこれをテストしていないことに注意してください。ドキュメントに埋め込まれた情報の断片から一緒に石畳になっています。