次の方法で共有


ワークフロー内でのローカル サービスの使用

Windows Workflow Foundation は、ワークフローのホスティング環境でのローカル通信サービスと Web サービスを使用するワークフロー間の通信をサポートします。Web サービスを使用するワークフロー通信の詳細については、「他のワークフローとのやり取り」を参照してください。

Windows Workflow Foundation ワークフロー通信サービスは、ユーザー定義のサービス クラスを、メソッドの呼び出しおよびイベント ハンドラとしてワークフロー作成者に公開し、送信および受信メッセージ交換のモデル化を容易にします。1 つのサービス クラス インスタンスを複数のワークフロー インスタンスに多重化すると、ホストの作成者は、イベント発生時に特定のワークフロー インスタンスを対象にしたまま、送信メッセージ用に 1 つの場所を対象にしてプログラムを作成できます。

ローカル通信サービスとホスト アプリケーションの通信方法を、次の図に示します。

ローカル ホスト通信

ワークフロー インスタンスのアクティビティ HandleExternalEventActivityCallExternalMethodActivity は、カスタム インターフェイス内で宣言され、カスタム ローカル サービスに実装されているイベントおよびメソッドと対話します。HandleExternalEventActivity アクティビティは、ホスト アプリケーションによって発生し、ローカル サービスによって実装される特定のイベントに対応します。CallExternalMethodActivity は、ローカル サービスに対してメソッドを呼び出します。HandleExternalEventActivityCallExternalMethodActivity の使用方法の詳細については、「HandleExternalEventActivity アクティビティの使用」および「CallExternalMethodActivity アクティビティの使用」を参照してください。

ワークフロー通信サービス

Windows Workflow Foundation ワークフロー通信サービスは、オブジェクトがワークフロー インスタンスと通信するための単純なメカニズムを実装します。通信チャネルはインターフェイスとして定義され、通信を容易にするためにランタイムに追加されるサービス クラスとして実装されます。

ワークフローは、サービス クラスに対して他のクラスと同様に動作します。このクラスとの通信は、イベントを発生させ、メソッドを呼び出すことによって行います。通信インターフェイスは、ワークフローに対して、受信イベント シンクを含むチャネル、および送信操作のメソッド呼び出しとして動作します。

インターフェイスの外部メソッド宣言は、ExternalDataExchangeService によって、サービス オブジェクトのメソッド呼び出しに変換されます。ローカル サービスとして参照できるクラスは、ワークフロー ランタイム エンジンによって途中受信され、ワークフローに対する受信メッセージとして配信されるイベントを発生させます。

ローカル ワークフロー通信インターフェイスを定義する方法を、次のコード例に示します。

[ExternalDataExchange]
public interface ICommunicationService
{
    void HelloHost(string message);
    event EventHandler<ExternalDataEventArgs> HelloWorkflow;
}

サービス クラス

サービス クラスは、ワークフローとの通信を定義するために使用されるインターフェイスを実装します。このインターフェイスのイベントはすべて一方向で、ref パラメータやout パラメータを持たないだけでなく、戻り値もありません。ただし、送信要求については、インターフェイスのメソッドは ref パラメータと out パラメータを持つことができるほか、戻り値を持つことができます。

通信モデルは、多対一です。つまり、多数のワークフロー インスタンス (多くの対話を実行していることがある) と、このシングルトン サービス オブジェクトです。つまり、あらゆるワークフローからの特定の m メソッドに対する送信呼び出しについては、すべて同じオブジェクトの同じ m がサービスを提供します。

逆に、すべての受信呼び出しは、明示的に正しいワークフロー インスタンスおよび対話に送られる必要があります。Windows Workflow Foundation には、送信呼び出しのワークフロー インスタンスと対話を区別する機構を備えた m があります。この 2 つの情報により、オブジェクトは適切なワークフロー インスタンスでの適切な対話に対して、応答を発信することができます。

Windows Workflow Foundation は、呼び出し元のワークフローのインスタンス識別子を、送信呼び出しスレッドの System.Workflow.Runtime.WorkflowEnvironment.WorkflowInstanceId に提供します。

通信サービスの実装を示すコード例を次に示します。

public class CommunicationService : ICommunicationService 
{
    public event EventHandler<ExternalDataEventArgs> HelloWorkflow;

    public void HelloHost(string message)
    {
        Console.WriteLine("This is the message: {0}", message);

        // Raise the HelloWorkflow event.
        HelloWorkflow(null, new ExternalDataEventArgs(WorkflowEnvironment.WorkflowInstanceId));
    }
}

次のコード例に示すように、ワークフローのインスタンスを開始する前に、ExternalDataExchangeService をワークフロー ランタイム エンジンに追加し、カスタム通信サービスを ExternalDataExchangeService に追加する必要があります。

ExternalDataExchangeService externalService = new ExternalDataExchangeService();
workflowRuntime.AddService(externalService);
externalService.AddService(new CommunicationService());

ローカル サービスとのホスト通信の例については、「HostCommunication Sample」を参照してください。

関連項目

参照

HandleExternalEventActivity
CallExternalMethodActivity

概念

HandleExternalEventActivity アクティビティの使用
CallExternalMethodActivity アクティビティの使用
他のワークフローとのやり取り
ワークフローとアプリケーション通信

その他の技術情報

HostCommunication Sample

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.