1

私は WCF を学ぼうとしていますが、それは十分に簡単に思えますが、奇妙な状況に遭遇しました...少なくとも私には奇妙に思えます。

ServiceHost ctor が具体的なクラスを取り、AddServiceEndpoint がインターフェイスを取り、その逆ではないのはなぜですか? 後者はOOPの観点からより論理的であるようです。

次の点を考慮してください。

    [ServiceContract]
    interface IVocalAnimal
    {
        [OperationContract]
        string MakeSound();
    }
  ...      
  public class Dog : IVocalAnimal
  {
     public string MakeSound()
     {
        return("Woof!");
     }
  }
 ...
 public class Cat : IVocalAnimal
  {
     public string MakeSound()
     {
        return("Meeooow!");
     }
  }

そこで、/AnimalSoundService/Dog または /AnimalSoundService/Cat を介して犬または猫の鳴き声を得るために接続できる「AnimalSound」サービスを作成したいと考えています。

...
Uri baseAddress = new Uri("net.pipe://localhost/AnimalSoundService");
ServiceHost serviceHost = new ServiceHost(typeof(IVocalAnimal), baseAddress);
serviceHost.AddServiceEndpoint(typeof(Dog), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "Dog");
serviceHost.AddServiceEndpoint(typeof(Cat), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "Cat");
...

しかし、上記のコードは、私がよく理解していない何らかの理由でコンパイルされません。

では、より細かい粒度のエンドポイントが特定の実装をサポートするのがより自然に思われるので(そのため、エンドポイントアドレスごとにコントラクトの特定の実装をヒットできます)、より一般的な ServiceHost は 1 つでなければならないので、その逆ではない理由は何ですかインターフェイスを受け入れるには?

ところで、私は衒学的ではありません..ここで何かを逃したのは私だと確信しているので、正直に理解しようとしています。

4

3 に答える 3

2

ServiceHost を作成すると、実際のサービスが作成されるため、具体的でなければなりません。

一方、エンドポイントはクライアントが見るものです。必ずしもクライアントに実装を知ってほしくない場合があります。クライアントはインターフェイス定義を取得する必要があります。

あなたが言うように、エンドポイントは特定の実装をサポートします:ServiceHostを作成するときに使用するものは何でも。エンドポイントの目的は、複数の実装を提供することではなく、単一の実装にアクセスするための複数のプロトコル/バインディングを提供することです。

個別の Dog サービスと Cat サービスが必要な場合は、それぞれに 1 つの NetNamedPipeBinding エンドポイントを持つ 2 つの ServiceHosts が必要になると思います。

于 2009-06-01T05:01:32.643 に答える
2

あなたの考えがわかります。OOP の観点からは理にかなっていますが、それはサービスの観点ではありません。サービスは操作のグループです。その操作のグループは、コントラクトで定義されます。クラスを使用してサービス コントラクトをモデル化できますが、インターフェイスはより直接的なモデルであるため、ほとんどの場合はインターフェイスを使用します。MSDN では、これらの概念について非常によく説明されています。

あなたは私を知らず、私もあなたを知らないことを忘れないでください。私たちは物ではなくメッセージを交換します。私はあなたから猫や犬を欲しくない. あなたが私にくれた猫や犬をどうするかは、事前の合意がない限りわかりません. あなたは私に何ができるかを教えてくれ、私はそれを行うためにあなたにメソッドを呼び出します。これは、内部のデータと外部のデータに関する優れた記事です。

于 2009-06-01T05:24:04.517 に答える
1

私は他の答えに少し同意しなければなりません。それらはある意味で技術的には正しいですが、実装を隠したり、サービス コントラクトを定義するためにクラスとインターフェイスを使用したりすることとはほとんど関係がないことが、最も重要な理由だと思います。

単一のサービス実装が複数のエンドポイントを公開できるという事実を考慮に入れると、なぜそうなのかはより明白になります。各エンドポイントは異なるコントラクトを公開する場合と公開しない場合があり、それぞれが異なるバインディングで公開される可能性があります。

たとえば、MSMQ で一方向のコントラクトを公開し、HTTP で双方向のコントラクトを公開するサービスがあるとします。または、ある URL で JSON コントラクトを公開し、別の URL で XML コントラクトを公開することもあるでしょう。

于 2009-06-01T13:25:55.903 に答える