虽然我努力学习WCF,它似乎足够直截了当,我经历了一个奇怪的情况...至少它似乎很奇怪,我就来了。

为什么是它ServiceHost的构造函数需要一个具体的类,并且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!");
     }
  }

所以,现在我们wanto创建可连接到拿到狗的声音或通过/ AnimalSoundService /狗或/ AnimalSoundService /猫

猫的“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");
...

但是,上面的代码将无法编译因为某种原因(S)我不太明白,ServiceHost的构造函数要具体类(因此无论是狗或猫)和终点想要的界面。

那么,它是什么,而不是相反的原因,因为它似乎对我更自然的更细粒度端点支持一个具体实现(所以你可以打每个端点地址合同的具体实现),而更普遍的ServiceHost应是一个接受接口?

顺便说一句,我不是pedantic..I我只是老老实实地想了解,因为我相信这是我错过的东西在这里。

有帮助吗?

解决方案

在创建ServiceHost的,你正在创建实际的服务,因此它必须是具体的。

您的端点,而另一方面,是你的客户看到。你不一定要你的客户知道你的实现 - 他们应该得到的接口定义

在endpoind不支持特定的实现,就像你说的:当你创建ServiceHost的所使用的任何一个。端点的目的,是不提供多个实现,而是提供多个协议/绑定访问单个实施方式。

如果你想不同的狗和猫的服务,我相信你会需要两个ServiceHosts,每一个NetNamedPipeBinding终点。

其他提示

我明白你在想什么。从OOP的角度来看,是有道理的,但是这不是一个服务的角度。服务是一组操作。这组操作是在合同中规定。您可以使用类服务合同模式,但使用最多的接口,因为接口是一个更直接的模型。 MSDN具有很好的讨论的这些概念

记住,你不认识我,我不认识你。我们交换信息,而不是对象。我不想从你的猫狗。我不知道如何处理猫或你给我的,除非我们有事先约定狗做的。你告诉我,我能做些什么,我呼吁你们的方法来做到这一点。这里有一个好文章的数据在里面与在外面的数据

我不同意一点与其他的答案。虽然他们在技术上正确的方式,我觉得这是它是有一点做与隐藏实现或使用类VS接口来定义服务合同的方式,最重要的原因。

这是一个很多显而易见的,为什么它是,如果你考虑到一个事实,即单个服务实现可以暴露多个端点的方式。每个端点可能,也可能不会,露出不同的合同,而且每一个可以在不同的结合被暴露,因为你知道一切。

例如,您可能有暴露在MSMQ单向合同,并通过HTTP双向合同的服务。或者也许它暴露于一个URL,并在另一个的XML一个JSON合同。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top