WCFのServiceHost ::&AddServiceEndpoint:引数の型が逆転していますか?

StackOverflow https://stackoverflow.com/questions/933570

  •  06-09-2019
  •  | 
  •  

質問

私は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 /犬または/ AnimalSoundService /猫

を経由して犬の音や猫を取得するために接続することができ、「AnimalSound」サービスを作成wanto
...
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のctorのは、具体的なクラス(その犬や猫のどちらかを)望んでいるし、エンドポイントは、インターフェイスを望んでいます。

より細かい粒度のエンドポイントは、特定の実装を(あなたがエンドポイントアドレスごとの契約の具体的な実装を打つことができ)、より一般的なのServiceHostは、必要がありますがサポートしているように私にはより自然に思えるように、

だから、その逆ではない理由は何ですかインターフェイスを受け入れるように一つで?

ところで、私はpedantic..Iはただ正直、私はそれがここで何かを逃した私である確信しているとして理解しようとしていますされていないのです。

役に立ちましたか?

解決

あなたはのServiceHostを作成するときに、あなたが実際のサービスを作成しているので、それは、コンクリートにする必要があります。

あなたのエンドポイントは、他の一方で、あなたの顧客が見るものです。あなたは、必ずしもあなたの顧客があなたの実装を知られたくない - 彼らは、インタフェース定義を取得する必要があります。

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

あなたは明確な犬や猫のサービスをしたい場合は、

、私はあなたが1つのNetNamedPipeBindingエンドポイントと2 ServiceHosts、それぞれが必要になりますと信じています。

他のヒント

私はあなたが考えて何を参照してください。 OOPの観点から、それは理にかなって、それはサービスの観点ではありません。サービスは、オペレーションのグループです。操作のそのグループは、契約で定義されています。インターフェースは、より直接的なモデルであるため、あなたはサービス契約が、ほとんどの用途のインタフェースをモデル化するためのクラスを使用することができます。 MSDNには、これらの概念の非常に良い議論を持っています。

あなたは私を知らないと私はあなたを知らない、覚えておいてください。私たちは、メッセージではなく、オブジェクトを交換します。私はあなたから犬や猫を望んでいません。私たちは事前の合意がない限り、私は猫やあなたが私を与えた犬と一緒に何をすべきかわからないだろう。あなたは私が何ができるかを教えて、私はそれを行うには、あなたのメソッドを呼び出します。ここでは外部のデータ対内部のデータに良い記事のですます。

私は他の回答に少し同意する必要があります。彼らは方法で技術的に正しいですが、私は、これはそれが実装を隠したりサービス契約を定義するためのクラス対インタフェースを使用したとはほとんどを持っている方法であることのために最も重要な理由を感じます。

それはあなたのアカウントに単一のサービスの実装では、複数のエンドポイントを公開することができるという事実を取る場合、それはある方法である理由

これは、より多くのは明らかです。各エンドポイントはかもしれない、あるいは、別の契約書を公開していない可能性があり、それぞれがあなたが知っているすべてのために、異なる結合上に露出することができます。

は、たとえば、MSMQオーバー一方向の契約およびHTTP経由で双方向の契約を公開するサービスを持っているかもしれません。それとも、それは1つのURLとXML別の1にJSON契約を公開します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top