次の方法で共有


仲介型サービスの要点

ブローカー サービスは、 IServiceBrokerを介して取得されたサービスであり、サービスとそのクライアントを個別の AppDomain、プロセス、またはマシン間 (Live Share の場合) に存在できるようにするための RPC 互換インターフェイスとして公開されます。 ブローカー サービスは、メインの Visual Studio プロセスまたはその一部の補助プロセスから提供される場合があり、Visual Studio 拡張機能によってこれらのプロセスのいずれかによって使用される場合があります。

「サービスのIServiceProvider」の説明に従って、 インターフェイスを介して、より多くの (仲介されていない) Visual Studio サービスを利用できます。 このようなサービスは通常、Visual Studio のメイン プロセスでのみ使用できますが、ブローカー サービスよりも大きな機能セットが公開されます。

Live Share ゲストで実行されている Visual Studio 拡張機能では、Live Share ホストによって提供されるこれらのサービスのサブセットにアクセスすることで、追加の機能が提供される場合があります。 Live Share ホストのセキュリティを損なう動作が悪い Live Share ゲストのリスクを軽減するために、Live Share 接続に対して承認チェックが適用されます。 Live Share 経由でサービスを公開することを選択したブローカー サービスの作成者は、「 ブローカー サービスを提供する方法」の説明に従って、承認チェックを実装するように注意する必要があります。

サービス仲介者

Visual Studio には 1 つのグローバル IServiceBrokerがあり、他のサービスを公開する GlobalProvider に似ています (取得可能)。 MEF を介して取得することもできます。

他のコンテキストに特化したサービスブローカーが、特定の Visual Studio 機能によって提供される場合があり、これらは独自の追加サービスを提供したり、一部の機能を抑制したりすることで、グローバルなサービスブローカーと統合することがあります。

IServiceBrokerは、(意図的に) クライアントがローカル、別のプロセス、または別のマシン上にある可能性のあるサービスを取得できるようにするブラック ボックスです。 サービス ブローカーは、ポリシーが適用された 1 つ以上の他のサービス ブローカーの集計である場合があります。

Visual Studio プロセスのコンテキストに基づいて、このグローバル サービス ブローカーは、他のサービス ブローカーの変化するセットの集計です。 プロセス内のコンテキストの変更により、アクティブ化される可能性のあるブローカー サービスのセットが変更される可能性があります。 たとえば、ソリューションが読み込まれると、アクティブなソリューションに特に関連するサービスが使用可能になることがあります。 同じサービスは、別のバックエンドの実装を使用する場合でも、「フォルダーを開く」ビューでも利用できます。 サービス実装の変更は、両方の実装が同じコントラクトを満たす必要があるため、そのサービスのクライアントに対して透過的になりますが、クライアントは、新しいインスタンスを取得するために、このコンテキスト変更 ( AvailabilityChanged経由で通知される) 全体でサービスのクエリを再実行する必要があります。

通常、サービス ブローカーは、サービスへのプロキシを取得するために使用されます。 つまり、クライアントは、サービス オブジェクトへの参照を直接受け取る代わりに、すべてのメソッド呼び出しをサービスに転送し、結果または例外をクライアントに転送するスタブを受け取ります。 また、サービスによって発生したイベントをクライアントに転送することもできます。 場合によっては、サービスがクライアントにコールバックするためにメソッドを呼び出すことができる "ターゲット オブジェクト" をクライアントが提供することをサポートまたは要求することがあります。

ブローカー サービス コンテナー

グローバル IBrokeredServiceContainerから利用できるようにするには、サービスをIServiceBrokerに提供する必要があります。 このサービス コンテナーは、サービス ファクトリをサービス ブローカーに公開するだけでなく、サービスにアクセスできるクライアントを制御し、そのサービスへのアクセスが変更されたときにそれらのクライアントに通知する役割も担います。

ブローカー サービスの構成

ブローカー サービスは、次の要素で構成されます。

  • サービスの機能を宣言し、サービスとそのクライアント間のコントラクトとして機能するインターフェイス。
  • そのインターフェイスの実装。
  • サービスに名前とバージョンを割り当てる ServiceMoniker
  • 必要に応じて RPC を処理するための動作とServiceRpcDescriptorを組み合わせたServiceMoniker
  • サービス ファクトリを提供するコード
  • サービス登録

サービス インターフェイス

これは、標準の .NET インターフェイス (多くの場合、C# で記述) である可能性があります。 ブローカー サービス クライアントとサービスが個別のプロセスに存在し、RPC 経由で通信できるようにするには、このインターフェイスは、サービスで使用する ServiceRpcDescriptor によって指定された制限に従う必要があります。 これらの制限には、通常、プロパティとインデクサーは許可されず、ほとんどのメソッドまたはすべてのメソッドは、Task または別の非同期互換性のある戻り値の型を返します。

仲介サービスの名称と記述子

サービスをアクティブ化するには、そのモニカーを知る必要があります。 モニカーはサービスの記述子に含まれているため、通常、クライアントは ServiceRpcDescriptorを処理できます。 記述子は、ブローカー サービスとそのクライアント間の RPC 接続を設定するために必要な動作、または Streamとの間で RPC 呼び出しをシリアル化する必要がある場合に必要な動作を追加します。

Visual Studio では、クライアントとサービスで RPC の通信が必要な場合に StreamJsonRpc ライブラリを利用するブローカー サービスに対して、 ServiceJsonRpcDescriptor 派生型を使用することをお勧めします。 StreamJsonRpc は、ここで説明する サービス インターフェイスに特定の制限を適用します。

記述子を直接使用する必要はほとんどありません。 代わりに、通常は、 VisualStudioServices またはサービスを提供するライブラリから取得され、 GetProxyAsyncの引数として使用されます。

ServiceMonikerクラスとServiceJsonRpcDescriptorクラスはどちらも不変であるため、static readonlyフィールドまたはプロパティとして安全に共有できます。 その他の ServiceRpcDescriptor派生型は不変である必要があります。

ServiceMonikerはシリアル化できます。 ServiceJsonRpcDescriptorはシリアル化できません。

サービス対象ユーザー

すべてのブローカーサービスは、ServiceAudienceからのフラグ群に登録されています。 これらのフラグは、ブローカー サービスが公開されるクライアントとその上の接続を制御します。

一般的な選択は ServiceAudience.Localであり、Visual Studio セッション内のローカル プロセスにサービスを公開します。 この設定では、ライブ共有セッションがアクティブな場合でも、サービスは常にローカルでアクティブになります。

ServiceAudience.LiveShareGuest フラグが追加されると、ブローカー サービスを要求する Live Share ゲストは、Live Share ホストとのリモート接続を介してそのブローカー サービスへのプロキシを取得します。

ServiceAudienceで定義されているフラグの任意の組み合わせは有効です。 LiveShareGuest フラグは、 フラグも設定Local設定できます。たとえば、ブローカー サービスを (Live Share ホストから) Live Share ゲストのみに公開し、ローカルで使用できないようにする (クライアントとサービスが同じプロセスにある場合)。

RemoteExclusiveClientフラグとRemoteExclusiveServer フラグは非推奨です。

クライアントがブローカー サービスを要求する場合、そのサービスの ServiceAudience やサービスがアクティブ化される場所を把握する必要はありません。 ただし、サービスがこの値を文書化する場合や、サービスを使用している開発者が、サービスがアクティブ化される可能性がある場所を認識し、さまざまなコンテキストでサービスから取得される可能性のあるデータの種類を予測したり、サービスを利用できるタイミングを予測したりするのに役立ちます。

ブローカー クライアントの構成

クライアントが仲介サービスを要求すると、サービスが利用できない場合には null が返され、アクティブ化に失敗した場合には ServiceActivationFailedException がスローされ、サービスに対する プロキシ が取得されます。 ブローカー サービスがクライアントと同じプロセスでアクティブ化されているか、別のプロセスでアクティブ化されるかに関係なく、プロキシが使用されます。 このプロキシは、クライアントがサービスが配置されている場所を認識する必要がないように、ローカルサービスとリモートサービスケース間で使用パターンを調和するのに役立ちます。