ワークフロー リフレクション ユーティリティのサンプル
ワークフロー リフレクション ユーティリティは、アセンブリからワークフロー関連の情報を抽出する拡張可能ツールです。各ワークフローの階層、宣言ルール、必要なローカル サービスは、ツリー ビューで表示されます。これは、コンパイルされたワークフローの構造を容易に参照できるようにするためです。また、アセンブリの各ワークフローは、メモ帳または再ホストされたデザイナ画面 XAML として表示できます。最後に、置換ベースの宣言型ルール エバリュエータを使用して、含まれる式の "what if" 分析を行います。
サンプルの使用
サンプルをビルド、実行、および構成するには、次の手順に従います。
サンプルをビルドするには
このトピックの [サンプルのダウンロード] をクリックしてサンプルをダウンロードします。
これにより、サンプル プロジェクトがローカルのハード ディスクに抽出されます。
[スタート] をクリックし、[すべてのプログラム] をポイントします。次に、[Microsoft Windows SDK] をポイントし、[CMD シェル] をクリックします。
サンプルのソース ディレクトリに移動します。
コマンド プロンプトで、「MSBUILD <ソリューション ファイル名>」と入力します。
サンプルを実行するには
- [SDK コマンド プロンプト] ウィンドウで、WorkflowReflectionUtility\bin\debug フォルダにある .exe ファイルを実行します (このサンプルでは、メイン フォルダの下にあります)。
ワークフロー リフレクション ユーティリティへアセンブリを読み込むには
WorkflowReflectionUtility.exe プログラムを起動します。
[File] メニューの [Open] をクリックします。
情報を抽出するワークフロー コンテンツを含むアセンブリを選択し、[Open] をクリックします。
アセンブリが読み込まれたら、ノードを展開してツリー ビューを表示します。
一部のノードには、状況依存のメニューがあります。たとえば、WorkflowNode では、メモ帳で XAML を表示したり、再ホストされたデザイン サーフェイスでワークフローを表示したりできます。
構成ファイル
ワークフロー リフレクション ユーティリティは、アプリケーション構成ファイルで制御されます。このファイルには WorkflowReflectionUtilitySection が含まれていますが、これは 1 つ以上の ReflectionComponent オブジェクトをコンポーネント コレクションに追加します。構成ファイルが欠落していると、ユーティリティは、ハードコーディングされているプログラム バージョンの既定構成ファイルを使用します。
既定では、ワークフロー リフレクション ユーティリティはアセンブリに含まれるすべてのワークフローを表示するように構成されています。各ワークフローのすべての宣言型ルール、使用されるすべての DataExchangeService インターフェイス、およびアクティビティ階層が表示されます。宣言型ルール ツリー ノードを右クリックして表示されるショートカット メニューを使用すると、置換ベースのルール表現エバリュエータにアクセスできます。ワークフロー ツリー ノードを右クリックして表示されるショートカット メニューを使用すると、XAML およびデザイナ ビューにアクセスできます。
既定の構成
既定の構成は、次のとおりです。
<configuration>
<configSections>
<section name="WorkflowReflectionUtilitySettings" type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.WorkflowReflectionUtilitySection, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</configSections>
<WorkflowReflectionUtilitySettings showAssemblyResolveExplanation="true">
<components>
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.AssemblyComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.WorkflowComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.RuleComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.XomlContextMenuComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.RequiredServiceInterfacesComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.RuleEvaluatorComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.WorkflowDesignerViewComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.WorkflowActivitiesComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</components>
</WorkflowReflectionUtilitySettings>
</configuration>
機能拡張
ワークフロー リフレクション ユーティリティは拡張性を備えるために設計されています。ツールに機能を追加するには、次の 2 つの抽象メソッドを含む、WorkflowReflectionComponent から派生した新しいコンポーネントを追加する必要があります。
public abstract void Initialize(InitializationContext context);
public abstract void PerformReflection(ReflectionContext context);
Initialize メソッド
ユーティリティの起動時には、Initialize メソッドが呼び出されます。これにより、リフレクション時にコンポーネントを自動構成することができます。現在のコンポーネントをいくつかの既存のコンポーネント タイプの子として追加するには、InitializationContext.AddChild を使用します。初期化後にこのメソッドを呼び出すと、コンポーネントのツリー構造を構築できます。このツリー構造は、アセンブリに対してリフレクションを実行するために取られるステップを表します。たとえば、AssemblyComponent は RootComponent の子として追加され、WorkflowComponent は AssemblyComponent の子として追加されます。これにより、リフレクション時に、ルート > アセンブリ > ワークフローという呼び出し構造が作成されます。コンポーネントに含めることのできる子の数に制限はありません。また、特定の子コンポーネントの追加先の親の数にも制限がなく、複数の親への追加が可能です。
ツリー ビューに表示できるイメージのリストにイメージを追加するには、InitializationContext.AddImage を使用します。各イメージは、所有者型と文字列名に基づいてキャッシュされます。これら 2 つの値は、リフレクション時にイメージの ImageList インデックスを取り出すためのキーとして使用されます。
PerformReflection メソッド
PerformReflection メソッドは、アセンブリを読み込む際に実際の処理を行います。ReflectionContext はコンポーネントに、アセンブリのアクセサ、現在のツリー ノード、およびツリー全体のビューを提供します。また、ReflectionContext はいくつかのメソッドも提供します。たとえば、すべての子コンポーネントを取得するメソッド、それまでにキャッシュされたイメージ インデックスを取得するメソッド、およびコンテキストの複製を作成するメソッドなどです。
RuleComponent を例に考えて見ましょう。初期化の際、RuleComponent は WorkflowComponent の子として追加され、キャッシュされたイメージを追加します。リフレクション時に、コンポーネントは現在のツリー ノード (WorkflowNode) にアクセスして、ワークフロー型を取得します。次にこのタイプに基づいてリフレクションを行い、すべての宣言型ルールを見つけ、それぞれに対応するノードを追加します。追加した各ノードに対して、新しく追加されたルール ノードを含む複製 ReflectionContext で、WorkflowReflectionComponent.InvokeChildComponents メソッドを呼び出します。
この一般的なパターンは、ノードにコンテキスト メニューを追加したり、ノードのテキストを変更したり、ノードを再編成したり、子ノードを追加したりする際に使用できます。サンプルと詳細については、OutOfBoxComponents.cs ファイルを参照してください。
新しいコンポーネントの構成
新しいコンポーネントを実行するには、これを構成ファイルに追加しておく必要があります。構成ファイルの完全な構造については、このトピックの「構成ファイル」のセクションを参照してください。
新しいコンポーネント ノードは次のようになります。
<add type="[AssemblyQualifiedName of component]"/>
例 :
<add type="Microsoft.Samples.Workflow.Applications.WorkflowReflectionUtility.AssemblyComponent, WorkflowReflectionUtility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
関連項目
その他の技術情報
アプリケーション サンプル
Windows Workflow Foundation のサンプル
Copyright © 2007 by Microsoft Corporation.All rights reserved.