Пока я пытаюсь выучить WCF, и это кажется достаточно простым, я попал в странную ситуацию ... по крайней мере, мне это кажется странным.
Почему компонент ServiceHost принимает конкретный класс, а AddServiceEndpoint - интерфейс, а не наоборот? кажется, что последнее более логично с точки зрения ООП.
Рассмотрим следующее:
[ServiceContract]
interface IVocalAnimal
{
[OperationContract]
string MakeSound();
}
...
public class Dog : IVocalAnimal
{
public string MakeSound()
{
return("Woof!");
}
}
...
public class Cat : IVocalAnimal
{
public string MakeSound()
{
return("Meeooow!");
}
}
Итак, теперь мы хотим создать службу «AnimalSound», которую вы можете подключить для получения звука собаки или кошки через / AnimalSoundService / Dog или / AnimalSoundService / Cat
...
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");
...
Но приведенный выше код не будет компилироваться, поскольку по некоторым причинам, которые я не совсем понимаю, ctor ServiceHost хочет конкретный класс (так что либо Dog, либо Cat), а EndPoint - интерфейс.
Так в чем причина того, что это не наоборот, так как мне кажется более естественным, что конечная точка более тонкой гранулярности поддерживает конкретную реализацию (так что вы можете использовать конкретные реализации контракта для каждого адреса конечной точки), в то время как более общий ServiceHost должен быть тем, кто принимает интерфейс?
Кстати, я не педантичен ... Я просто честно пытаюсь понять, так как уверен, что я что-то здесь упустил.