2

IEnumerableWCFで実際のオブジェクトへのリストまたはプロキシを生成するにはどうすればよいですか? 私は自己ホスト型アプリケーションでこれを行っています。

ここに私が持っているものがあります:

public interface IRemoteControlGroup {
     List<IRemoteControl> GetInstances();
}

public class RemoteControlGroupImpl : IRemoteControlGroup {
    public List<IRemoteControl> GetInstances()
    {
        System.Console.Error.WriteLine("Called GetInstances()");
        List<IRemoteControl> list = new List<IRemoteControl>();
        // implementation detail: get this list of IRemoteControl objects
        return list;
    }
}

public interface IRemoteControl {
     void Stop();
     void Start();
     void GetPID();
}

public class RemoteControlImpl : IRemoteControl {
     // actual implementation
}

私はWCFに次のことを望みます:

  • RemoteControlGroupImplの契約で定義されたサービス を提供しIRemoteControlGroupます。
  • List<IRemoteControl>(クライアント上で) がいつ呼び出されるか教えてくださいIRemoteControlGroup.GetInstances()。ここで、リストの要素はIRemoteControl(ホストの実際のIRemoteControlオブジェクトを呼び出すことによって) 実装するプロキシです。

RemoteControlImplWCF がネットワーク経由で実際のオブジェクトをプッシュすることは望ましくありません。を実装するプロキシをプッシュしたいだけですIRemoteControlRemoteControlImplオブジェクトには実際にはローカル システムへのハンドル (アプリは GUI インターフェイスのみを公開するため、ウィンドウ ハンドル) が含まれているため、シリアル化できません。によって返される要素の数はGetInstance()さまざまです。

この記事を見つけました、これは私が欲しいもののように聞こえます。すこし。しかし、コードでこれを行う方法は教えてくれません。ちょうど構成にあります。また、私が望むものを完全に説明していません。サービスのエントリ ポイントはプロキシを提供します。しかし、サービスのエントリ ポイントでプロキシのリストを配信する必要があります。

4

1 に答える 1

0

@John Saunders が指摘したように、アプローチを再考する必要があります。「複数の」インスタンスの原因に応じて、役立つ可能性のある一般的なアプローチをいくつか考えることができます。

1) それらがアプリケーションの外部から駆動される場合 (つまり、使用可能な IRemoteControl ターゲットのリストが実行時に動的に変更されない場合)、複数のエンドポイントを介して同じコントラクトを公開できます。たとえば、 http://localhost/remotecontrol.svc/instance1http://localhost/remotecontrol.svc/instance2などです。さまざまなエンドポイントの可用性は、WSDL を介して公開できます。

2) 複数のターゲットが動的である場合、最も簡単な方法はコントラクトを再定義することです。

public interface IRemoteControlGroup {
     List<string> GetInstances();
     void Stop(string instanceId);
     void Start(string instanceId);
     void GetPID(string instanceId);
}

内部的には、サービスは、InstanceId をキーとする使用可能な IRemoteControl オブジェクトのディクショナリを維持し、着信操作をターゲット インスタンスにルーティングするだけです。

于 2012-02-20T22:55:22.230 に答える