はじめに
WWF を使用すると、プロセッサ フロー ベースのワークフローを作成し、任意の種類の .NET アプリケーションにデプロイできます。さらに、この記事では、ASP.NET 開発者が直面するいくつかの固有の問題、つまり状態やページ ナビゲーションの維持など、ワークフローを使用することで解決できる問題についても説明します。
2005 年 9 月、Microsoft は年 2 回の専門開発者カンファレンスで Windows Workflow Foundation (WWF、Windows Workflow Foundation) を発表しました。 WinFX API の柱の 1 つとして、WWF はプロセス主導型およびワークフロー中心のアプリケーションを開発するための共通フレームワークを開発者に提供します。
現在、一部の組織はビジネス プロセス全体を自動化しようとしていますが、その標準的な答えは、対応するコードを開発する開発者チームを編成することです。このアプローチはこれらの組織にはうまく機能しますが、固有の問題がいくつかあります。この問題を深く理解するには、ワークフローの基本的な特性を理解する必要があります。
ワークフローは本質的に、作業単位の完了に関連するアクティビティをアーカイブするための方法です。通常、処理中、作業は 1 つ以上のアクティビティを通じて「フロー」します。これらのアクティビティは機械または人間によって実行でき、インターネット アプリケーションでページの順序を定義するなど単純な場合もあれば、多数の人が閲覧、変更、承認する必要があるドキュメントや製品の管理など複雑な場合もあります。複雑な。
非常に多くのワークフローでは人間の関与を考慮する必要があるため、完了までに数時間から数か月以上の長い時間がかかる場合があります。たとえば、プロセスに関与する人が不在であるか、現地にいない、または他のタスクで忙しい場合があるため、ワークフローは非アクティブな期間中も継続できる必要があります。さらに、コーディングによって独自に実装されたプロセスは、技術者以外の人にとっては理解しにくく、開発者にとっては変更が難しい場合があります。これやその他の要素は、まさに Windows WF などの汎用ワークフロー フレームワークの目標です。このフレームワークは、ワークフローに視覚的なインターフェイスを提供するか、実現される共通の API セットを定義することによって、ワークフローの作成、変更、管理を容易にすることを目的としています。
WWF ワークフローは、Windows フォーム、コンソール アプリケーション、Windows サービス、ASP.NET Web アプリケーションなど、あらゆる種類の .NET アプリケーションに配置できます。それぞれのタイプには特別な考慮事項が必要です。いくつかの既存の例は、ワークフローを Windows フォームやコンソール アプリケーションにホストする方法を説明するのに十分ですが、この記事では、ワークフローを独自のアプリケーションに統合したい ASP.NET 開発者が直面する問題に焦点を当てます。
著者注: この記事で提供されているコードは、Windows WF Beta 1 および Visual Studio 2005 Beta 2 を使用して作成されました。 Windows WF のインストールに関する情報は、 www.windowsworkflow.netで参照できます。この記事では Windows WF の基本の一部について説明しますが、この分野では他のリソースも利用できます。読者は Windows WF について少なくとも少しは知っていると思います。この記事の目的は、Windows WF について高レベルから説明するのではなく、Windows WF と ASP.NET を詳しく分析することです。
1. Windows WF および MVC パターン
ASP.NET アプリケーションを開発する場合、WWF を使用する一般的な方法は、モデル ビュー コントローラー (MVC) アプローチを実装することです。本質的に、MVC の目標は、プレゼンテーション層、アプリケーション ロジック、およびアプリケーション フロー ロジックを分離することです。
これを理解することは、ASP.NET アプリケーションを開発するときに非常に有益です。ヘルプ デスク チケット ワークフローの場を検討してください。ビジネス ユーザーが ASP.NET Web フォームに記入し、送信ボタンをクリックしてこのワークフローを開始すると仮定します。次に、サーバーは Windows フォーム アプリケーションを使用して従業員とヘルプ デスクに「新しいチケットが利用可能です」と通知します。その後、ヘルプ デスクの従業員が問題に取り組み、最終的にチケットをクローズします。 Windows WF を使用してこのワークフロー シナリオを開発する場合、すべての処理ロジックとフローをワークフロー自体に含めることができ、ASP.NET アプリケーションはこのロジックをまったく理解する必要がありません。
この種の場では、確かな証拠が提供されます。説明と論理を分離するのは良いことです。ヘルプ デスクのリクエストを処理するこのプロセスは非常に日常的なものであるため、C# または VB.NET コードを使用してこのロジックを複数の異なる .NET アプリケーションに実装すると、コーディングが重複したり、まったく異なるコード リードを使用したりする危険が生じます。同じビジネスプロセスの異なる実装に。しかし、WWF を使用してこのプロセスを実装すると、このプロセスを必要とするアプリケーション開発者は、アプリケーション ロジックの変更を心配することなく、1 か所のステップ (ワークフロー自体) を変更するだけで済みます。 Windows WF を使用すると、コードの重複とこのプロセスの実装場所を軽減できます。
Windows WF を使用して ASP.NET に MVC アーキテクチャを実装する場合、開発者は、ワークフローがアプリケーション内でホストされている間に、アプリケーションから独立したワークフローを構築するように努める必要があります。これにより、ロジックを記述から独立させ、一連の作業ステップと Web アプリケーションのページ フローとの間の高度な独立性を維持することができます。
新しい WWF 開発者は、特定の順序で固定数のアクティビティを含むワークフローを開発し、同じ順序で 1 つのフォームから別のフォームに流れる一連の ASP.NET Web フォームを開発しようとするかもしれません。残念ながら、これは論理的であるように見えますが、ワークフロー ロジックを再度実装することになるため、実際には非常に非生産的です。 Web ページ X は、このワークフロー ステップを正しく実装するためにページ Y またはページ Z に移動する必要があるかどうかを知る必要はありません。代わりに、ワークフロー (モデル) が ASP.NET (コントローラー) に次に何をするかを指示し、ASP.NET がどのページを表示するかを決定する必要があります。このように、各ページはプロセス全体をほとんど理解する必要がなく、別のアクティビティを完了する方法を知り、ページがある場所から別の場所にどのように流れるかをワークフローに任せるだけで済みます。この分離により、開発者はページ フローを扱う際に大きな柔軟性が得られます。たとえば、ページの表示順序を変更する場合、ASP.NET アプリケーションのコードを 1 行も変更することなく、ワークフロー内から簡単に変更できます。
2. 単純なワークフロー MVC の例
このアイデアを説明するために、単純な ASP.NET アプリケーションとワークフローを示します。この非常に単純化されたワークフローは、外部アプリケーションからいくつかの個人情報を収集し、それを表示するプロセスを説明しています。手順は次のとおりです。
1. メソッドを呼び出します。これは、人の名前を要求することを意味します。このワークフローでは、InvokeMethod アクティビティを使用します (図 1 を参照)。
2. イベントが発生するまで待ちます。これは、名前を受け取ることを意味します。このステップでは、ワークフローは EventSink アクティビティを使用します。
3. 同様の呼び出しを使用してホストから電子メール アドレスを取得します。
4. イベントを待つということは、アドレスを受信することを意味します。
5. 名前と電子メールを受信した後、ワークフローは InvokeMethod アクティビティを開始して、呼び出し側アプリケーションに個人情報を送信します。実際の状況では、この最後のステップはそれほど重要ではありません。おそらく、Web サービスを呼び出してデータを別のシステムに送信したり、データベースに保存したりすることになるでしょう。
図 1. サンプル ワークフロー: このワークフローは、サンプル ASP.NET アプリケーションに暗黙的に含まれるプロセスを説明します。
このワークフローを ASP.NET で実装するには、人の名前を収集するページ、電子メール アドレスを収集するページ、および個人データを表示するページが必要です。データ ログイン フォームでは、その前後に何が起こったのかを知ることができないことに注意してください。表示ページについても同様です。ただし、ASP.NET アプリケーションは、ユーザーにどのページを表示するかを認識する必要があります。これがコントローラーを導入する目的です。この例では、HTTP ハンドラーを使用してソリューションを実装します。 WorkflowController と呼ばれるこのカスタム ハンドラーは、次のタスクを担当します。
· ワークフローの実行時間への参照を取得します。
· 既存のワークフロー インスタンスへの参照を取得するか、新しいワークフロー インスタンスを開始します (これは、ワークフロー インスタンスが開始されているかどうかによって異なります)。
·コントローラーとワークフロー間の通信を確立します。
·このワークフローからイベントを処理します。
·現在実行されているワークフローのレイヤーに応じて、どのページを表示する必要があるかを ASP.NET に指示します。
ご覧のとおり、このカスタム ハンドラーは基本的に、WWF とページ コントロールに関連するすべての作業を処理し、バックグラウンドで実行されているアクションについて個々の ASP.NET ページを「サイレント」に保ちます。 Web フォームで考慮する必要があるのは、当面の特定のタスクを実行し、必要なデータをコントローラーに渡すことだけです。
デフォルトでは、WWF は非同期モデルで動作します。これは、アプリケーション ホストがワークフロー インスタンスを開始すると、ワークフローが別のスレッドで実行を継続している間、制御がすぐにホストに返されることを意味します。これは、ユーザー インターフェイスの継続的な応答性が非常に望ましい Windows フォーム アプリケーションで役立つ場合があります。この非同期モデルを使用すると、ユーザーがアプリケーションを操作し続けながら、ワークフローをバックグラウンドで実行できます。ただし、Web アプリケーションでは、通常、サーバーが作業単位を完了した後でのみ制御がユーザーに返されるため、この種の動作は予期されない場合があります。これはまさに Windows WF のスケーラビリティを体現したものです。 Windows WF では、開発者は「ランタイム サービス」を使用または作成して、ワークフロー ランタイムを監視したり、変更したりすることができます。例としては次のものが挙げられます。
· 永続化サービス - 実行時とアイドル時の間でワークフローの状態を保存します。
· トレーシング サービス - ワークフローの実行に関する情報をメディアに出力します。
· トランザクション サービス - ワークフローの実行中にデータの整合性を維持します。
さらに、スレッド サービスにより、開発者はワークフロー インスタンスの実行方法を制御できます。が実行されます。前に説明したように、ワークフロー ランタイムはデフォルトで、ホストから独立したスレッド上でインスタンスを非同期的に実行します。ただし、これは ASP.NET が期待するものではない可能性が高いため、デフォルトのワークフロー スレッド サービスを交換する必要があります。幸いなことに、Microsoft はこの ASPNetThreadingService に対するソリューションを提供しています。この変更を実装するには、手動コーディングによって ASPNetThreadingService をワークフロー ランタイム サービスに追加するか、web.config ファイルでこのタスクを完了します。この記事のサンプル アプリケーションでは構成モードを使用します。 web.config の workflow runtime/services セクション (リスト 1 を参照) に、次のような行を追加します。
<add type=
「System.Workflow.Runtime.Hosting.ASPNetThreadingService,
System.Workflow.Runtime、バージョン = 3.0.00000.0、
Culture=中立、PublicKeyToken=31bf3856ad364e35"/>
3. コントローラー ロジックの実装
次に、HTTP プロセッサーを使用してコントローラー ロジックを実装する必要があります。このコントローラーを構築するには、IHttp ハンドラー インターフェイスを実装する WorkflowController ハンドラーと呼ばれるクラスを作成するだけです。これまでのところ、Windows WF について特別なことは何も見ていません。これは ASP.NET に固有の機能です (続きを読んでください)。
この WorkflowController プロセッサ クラスでは、ProcessRequest という名前の IHttp プロセッサ インターフェイス メソッドが ASP.NET アプリケーションからの Web 要求を処理します。ここでは、静的ワークフロー ランタイム インスタンスへの参照を取得し、ワークフローのイベント ハンドラーを作成し、ワークフローの実行を開始する必要があります。ワークフロー インスタンスを開始する前に、リクエストのクエリ文字列値にワークフロー インスタンス ID を表す GUID が含まれているかどうかを確認する必要があります。この ID が存在する場合は、すでにインスタンスが実行されていることがわかり、そのインスタンスへの参照を取得して実行を続行できます。この ID が存在しない場合は、新しいインスタンスを作成し、ワークフロー ランタイムで Start Workflow メソッドを呼び出して実行プロセスを開始する必要があります。
インスタンスが開始された後、イベント ハンドラーはワークフローの内外の通信を管理します。この記事の目的はローカル通信サービスについて説明することではないため、ここではこのトピックについて詳しく説明しませんが、その高度な実装テクニックを分析し、これが ASP.NET アプリケーションでどのように機能するかについて再度説明します。通信処理を容易にするには、ワークフローとホストの内外で情報を記述するために使用されるいくつかの .NET インターフェイスが必要です。これらは、この記事に添付されている WorkflowClassLibrary プロジェクトのソース コードにあります。これらのインターフェイスを実装するクラスと、ワークフロー メカニズムの実装に必要な対応する機能も見つかります。
web.config ファイルをもう一度簡単に見てみましょう。前に説明した ASPNetThreadingService 要素の近くで、次の 3 つの要素を使用して通信サービス クラスを記述していることに注意してください。
<add type="Workflow.RuntimeServices.GetNameService,
Workflow.Library、バージョン = 1.0.0.0、カルチャー = 中立、
PublicKeyToken=c4620ae819b5257e"/>
<add type="Workflow.RuntimeServices.GetEmailService,
Workflow.Library、バージョン = 1.0.0.0、カルチャー = 中立、
PublicKeyToken=c4620ae819b5257e"/>
<add type="Workflow.RuntimeServices.SendDataService,
Workflow.Library、バージョン = 1.0.0.0、カルチャー = 中立、
PublicKeyToken=c4620ae819b5257e"/>
ここには、ワークフロー ランタイム ライブラリに SqlStatePersistenceService を使用するように指示する要素もあります。この追加サービスは、ページ要求間の SQL サーバー データベースにワークフロー状態の永続性を保存します。このデータベースは手動で作成する必要があります。ただし、Microsoft はこれを行うための SQL スクリプトを C:WINDOWSMicrosoft.NETFrameworkv2.0.50215Windows Workflow FoundationSQL フォルダーに提供しています。モデル サービスと同様に、これらのサービスをプログラムで追加できます。ただし、これを構成に実装することもできます。これにより、コードの生成後でも、記述するコードの量が大幅に削減され、柔軟性が得られます。構成には、Windows WF ランタイムをサポートする HttpModule を追加する行があります。 ASP.NET には、前述の Http ハンドラー コントローラーを設定する行もあります。
結論として、Windows WF には非常に使いやすい機能が含まれています
。開発者がワークフロー ベースのアプリケーションを開発するための拡張可能なフレームワークは、テクノロジ サービス会社や ISV でない限り、Windows WF などのツールを使用してビジネス プロセスと運用プロセスを提供する必要があります。 、開発者は開発プロセスを簡単かつ柔軟に行うことができます。