通常、ワークフロー アプリケーション内でルールを使用する場合、ルールはアセンブリの一部です。 一部のシナリオでは、RuleSet をアセンブリとは別に保持して、ワークフロー アセンブリを再構築して配置せずに更新できるようにすることができます。 このサンプルでは、データベース内の RuleSet を管理および編集し、実行時にワークフローからこれらの RuleSet にアクセスできます。 これにより、実行中のワークフロー インスタンスに RuleSet の変更を自動的に組み込むことができます。
External RuleSet Toolkit サンプルには、データベース内の RuleSet バージョンの管理と編集に使用できる Windows フォーム ベースのツールが含まれています。 また、これらのルールを実行するためのアクティビティとホスト サービスも含まれます。
注
このサンプルには Microsoft SQL Server が必要です。
Visual Studio には、Windows Workflow Foundation (WF) の一部として RuleSet エディターが用意されています。 このエディターを起動するには、ワークフロー内の Policy
アクティビティをダブルクリックします。定義された RuleSet オブジェクトをワークフローに関連付けられている .rules ファイルにシリアル化します ( Policy
アクティビティは、ワークフローに対して RuleSet インスタンスを実行します)。 ワークフロー プロジェクトをビルドすると、.rules ファイルがリソースとしてアセンブリにコンパイルされます。
このサンプルのコンポーネントは次のとおりです。
データベース内の RuleSet バージョンを編集および管理するために使用できる RuleSet グラフィカル ユーザー インターフェイス ツール。
ホスト アプリケーションで構成され、データベースから RuleSet にアクセスする RuleSet サービス。
RuleSet サービスから RuleSet を要求し、ワークフローに対して RuleSet を実行する
ExternalPolicy
アクティビティ。
コンポーネントの相互作用を次の図に示します。 以下のセクションでは、各コンポーネントについて説明します。
RuleSet ツール
次の図は、RuleSet ツールのスクリーンショットです。 [ルール ストア] メニューから、使用可能な RuleSet をデータベースから読み込み、変更した RuleSet をストアに保存し直すことができます。 アプリケーション構成ファイルは、RuleSet データベースのデータベース接続文字列を提供します。 ツールを起動すると、構成されたデータベースから RuleSet が自動的に読み込まれます。
RuleSet ツールは、メジャー バージョン番号とマイナー バージョン番号を RuleSet に適用します。これにより、複数のバージョンを同時に保守および格納できます (このツールでは、バージョン管理機能に加えて、ロックやその他の構成管理機能は提供されません)。 このツールを使用すると、新しい RuleSet バージョンを作成したり、既存のバージョンを削除したりできます。 [ 新規] をクリックすると、新しい RuleSet 名が作成され、バージョン 1.0 が適用されます。 バージョンをコピーすると、ツールは、含まれているルールを含む、選択した RuleSet バージョンのコピーを作成し、新しい一意のバージョン番号を割り当てます。 これらのバージョン番号は、既存の RuleSet のバージョン番号に基づいています。 RuleSet の名前とバージョン番号は、フォームの関連付けられているフィールドを使用して変更できます。
[ルールの 編集] をクリックすると、次の図に示すように RuleSet エディターが起動します。
これは、Windows Workflow Foundation Visual Studio アドインの一部であるエディター ダイアログの再ホストです。 Intellisense のサポートなど、同じ機能が提供されます。 ルールは、ツールの RuleSet に関連付けられているターゲットの種類 (ワークフローなど) に対して作成されます。メイン ツール ダイアログで [ 参照 ] をクリックすると、図 4 に示すように、[ ワークフロー/タイプ セレクター ] ダイアログが表示されます。
図 4: ワークフロー/型セレクター
[ワークフロー/型セレクター] ダイアログを使用して、アセンブリとそのアセンブリ内の特定の型を指定できます。 この型は、ルールを作成 (および実行) する対象の型です。 多くの場合、ターゲットの種類はワークフローまたはその他のアクティビティの種類です。 ただし、任意の .NET 型に対して RuleSet を実行できます。
データベース内のアセンブリ ファイルと型 name are stored with the
RuleSet へのパス。RuleSet がデータベースから取得されると、ツールはターゲットの型を自動的に読み込もうとします。
[ワークフロー/型セレクター] ダイアログで [OK] をクリックすると、選択した型が RuleSet に対して検証され、ターゲットの型にルールによって参照されるすべてのメンバーが含まれるようにします。 [ 検証エラー ] ダイアログにエラーが表示されます。 エラーに関係なく変更を続行するか、[ キャンセル] をクリックできます。 メイン ツール ダイアログの [ツール ] メニューから、[ 検証 ] をクリックして、ターゲット アクティビティに対して RuleSet バージョンを再検証できます。
ツールの [ データ ] メニューから、RuleSet をインポートおよびエクスポートできます。 [ インポート] をクリックすると、ファイル選択ダイアログが表示され、そこから .rules ファイルを選択できます。 これは、Visual Studio で最初に作成されたファイルである場合とそうでない場合があります。 .rules ファイルには、条件のコレクションと RuleSets のコレクションを含むシリアル化された RuleDefinitions
インスタンスが含まれている必要があります。 このツールは条件コレクションを使用しませんが、visual Studio 環境との対話を可能にするために RuleDefinitions
.rules 形式を使用します。
.rules ファイルを選択すると、 RuleSet セレクター ダイアログが表示されます。 このダイアログボックスを使用して、インポートするファイルから RuleSet を選択できます (既定では、すべての RuleSet が指定されます)。 WF プロジェクト内でのバージョン管理はアセンブリのバージョンと同じであるため、.rules ファイル内の RuleSet にはバージョン番号がありません。 インポートプロセス中に、ツールは次に利用可能なメジャーバージョン番号を自動的に割り当てます(インポート後に変更できます)。割り当てられたバージョン番号は、 RuleSet セレクター の一覧で確認できます。
このツールは、インポートする RuleSet ごとに、RuleSet で使用されているメンバーに基づいて、.rules ファイルの場所 (存在する場合) の下にある bin\Debug フォルダーから関連する型を検索しようとします。 ツールが複数の一致する型を検出すると、.rules ファイル名と型名の一致に基づいて型の選択が試みられます (たとえば、 Workflow1
型は Workflow1.rules に対応します)。 複数の一致が存在する場合は、型の選択を求められます。 この自動識別メカニズムが一致するアセンブリまたは型の検索に失敗した場合は、インポート後にメイン ツール ダイアログの [参照 ] をクリックして、関連付けられている型に移動できます。 次の図は、RuleSet セレクターを示しています。
メイン ツール メニューから [ データのエクスポート ] をクリックすると、 RuleSet セレクター ダイアログが再び表示され、そこからエクスポートする必要があるデータベースの RuleSet を決定できます。 [OK] をクリックすると、[ファイルの保存] ダイアログが表示され、結果の .rules ファイルの名前と場所を指定できます。 .rules ファイルにはバージョン情報が含まれていないため、指定された RuleSet 名を持つ RuleSet バージョンを 1 つだけ選択できます。
PolicyFromService アクティビティ
PolicyFromService
アクティビティのコードは簡単です。 WF で提供される Policy
アクティビティとよく似ていますが、.rules ファイルからターゲット RuleSet を取得する代わりに、ホスト サービスを呼び出して RuleSet インスタンスを取得します。 次に、ルート ワークフロー アクティビティ インスタンスに対して RuleSet を実行します。
ワークフローでアクティビティを使用するには、ワークフロー プロジェクトから PolicyActivities
アセンブリと RuleSetService
アセンブリへの参照を追加します。 ツールボックスにアクティビティを追加する方法については、このトピックの最後の手順を参照してください。
ワークフローにアクティビティを配置した後、実行する RuleSet の名前を指定する必要があります。 名前をリテラル値として入力することも、別のアクティビティのワークフロー変数またはプロパティにバインドすることもできます。 必要に応じて、実行する必要がある特定の RuleSet のバージョン番号を入力できます。 メジャー バージョン番号とマイナー バージョン番号の既定値を 0 のままにすると、アクティビティに対してデータベース内の最新バージョン番号が自動的に指定されます。
RuleSet サービス
サービスは、指定された RuleSet バージョンをデータベースから取得し、呼び出し元のアクティビティに返す役割を担います。 前に説明したように、 GetRuleSet
呼び出しで渡されるメジャー バージョンとマイナー バージョンの値の両方が 0 の場合、サービスは最新バージョンを取得します。 この時点では、RuleSet 定義またはインスタンスのキャッシュはありません。同様に、RuleSet バージョンを "デプロイ済み" としてマークして進行中の RuleSet と区別する機能はありません。
サービスによってアクセスされるデータベースは、アプリケーション構成ファイルを使用してホストで構成する必要があります。
ツールを実行するには
ツールとサービスで使用される RuleSet テーブルを設定するフォルダーには、Setup.sql ファイルが含まれています。 Setup.cmdバッチ ファイルを実行して、SQL Express で Rules データベースを作成し、RuleSet テーブルを設定できます。
バッチ ファイルまたはSetup.sqlを編集し、SQL Express を使用しないか、
Rules
以外の名前のデータベースにテーブルを配置するように指定した場合は、RuleSet ツールとUsageSample
プロジェクトのアプリケーション構成ファイルを同じ情報で編集する必要があります。Setup.sql スクリプトを実行したら、
ExternalRuleSetToolkit
ソリューションをビルドし、ExternalRuleSetTool プロジェクトから RuleSet ツールを起動できます。RuleSetToolkitUsageSample
シーケンシャル ワークフロー コンソール アプリケーション ソリューションには、サンプル ワークフローが含まれています。 ワークフローは、PolicyFromService
アクティビティと、ターゲット RuleSet を実行する 2 つの変数 (orderValue
とdiscount
) で構成されます。サンプルを使用するには、
RuleSetToolkitUsageSample
ソリューションをビルドします。 次に、RuleSet ツールのメイン メニューで、[ データのインポート ] をクリックし、RuleSetToolkitUsageSample フォルダー内の DiscountRuleSet.rules ファイルをポイントします。 インポートした RuleSet をデータベースに保存するには、[ Rule Store-Save] メニュー オプションをクリックします。PolicyActivities
アセンブリはサンプル ワークフロー プロジェクトから参照されるため、PolicyFromService
アクティビティがワークフローに表示されます。 ただし、既定ではツールボックスには表示されません。 ツールボックスに追加するには、次の操作を行います。ツールボックスを右クリックし、[ 項目の選択 ] を選択します (しばらく時間がかかる場合があります)。
[ ツールボックス項目の選択] ダイアログが表示されたら、[ アクティビティ ] タブをクリックします。
PolicyActivities
ソリューションでExternalRuleSetToolkit
アセンブリを参照し、[開く] をクリックします。[
PolicyFromService
] ダイアログでアクティビティが選択されていることを確認し、[OK] をクリックします。これで、アクティビティが RuleSetToolkitUsageSample Components カテゴリのツールボックスに表示されます。
RuleSet サービスは、Program.csの次のステートメントを使用して、コンソール アプリケーション ホストで既に構成されています。
workflowRuntime.AddService(new RuleSetService());
構成ファイルを使用してホスト上のサービスを構成することもできます。詳細については、SDK のドキュメントを参照してください。
アプリケーション構成ファイルがワークフロー プロジェクトに追加され、サービスによって使用されるデータベースの接続文字列が指定されます。 これは、RuleSet テーブルを含むデータベースを指す RuleSet ツールで使用される接続文字列と同じである必要があります。
他のワークフロー コンソール アプリケーションと同様に、
RuleSetToolkitUsageSample
プロジェクトを実行できるようになりました。 Visual Studio 内で F5 キーまたは Ctrl キーを押しながら F5 キーを押すか、RuleSetToolkitUsageSample.exe ファイルを直接実行します。注
使用サンプル アセンブリが読み込まれるため、RuleSet ツールを閉じて使用サンプルを再コンパイルする必要があります。
.NET