2014-09-28 2 views
1

В WCF Client Architecture, он говоритпочему объект интерфейса контрактной службы WCF может быть преобразован в IClientChannel

При использовании класса ChannelFactory с интерфейсом контракта на обслуживание, вы должны привести к интерфейсу IClientChannel явно открыть, закрыть или прервать канал

Так вы создаете и использовать объект канала клиента, как это:

var cf = new ChannelFactory<ICalculator>(binding, ea); 

var channel = cf.CreateChannel(); 
double result = channel.Add(5.2, 3.5); 
Console.WriteLine(channel.GetType()); // outputs ICalculator 
Console.WriteLine(result); 

((IClientChannel)channel).Close(); 

Th Это две вещи, которые меня путают.

  1. Метод signaure из CreateChannel, а также первый выход стандарт, указывает на то, что переменная канала имеет тип ICalculator, как он может быть преобразован в IClientChannel?
  2. Объект, возвращенный CreateChannel должен быть определенный объект TypeOf который реализует независимо интерфейс (ы), и channel.GetType() должен вернуть этот точный тип, поэтому он возвращает тип интерфейса?

ответ

3

Я недавно изучал то же самое, потому что я пытался понять, почему я мог бросить мой канал как объект ICommunicationObject a s Я видел некоторые из исходного кода WCF.

В основном .NET имеет информацию о типе, которая ему нужна во время выполнения.

скажем, у нас есть класс, который реализует интерфейс

class Foo: IFoo {} 

вы можете объявить объект как этот

IFoo instance = new Foo() 

, но вы также можете бросить экземпляр непосредственно как Foo()

Foo cast = (Foo)instance; 

Поскольку объект может быть преобразован или преобразован в его тип во время выполнения.


Так что же делает WCF?

Для удовольствия, попробуйте создать экземпляр канала завод с собственным интерфейсом

IFoo instance = new ChannelFactory<IFoo>() 

вы получите исключение во время выполнения.

«InvalidOperationException Пытались получить тип контракта для IFoo, но этот тип не является ServiceContract, и не
наследуют ServiceContract.»

Когда вы украшаете интерфейс атрибутом [ServiceContract], среда выполнения WCF выбирает это и строит все классы, которые WCF должен построить для вашего канала.

Это включает в себя такие интерфейсы, как ICommunicationObject, IChannelFactory < TChannel>, IClientChannel и т. Д.

Таким образом, хотя фабричный метод предоставляет ваш экземпляр как IFoo, во время выполнения он также имеет другие интерфейсы, которые должен выполнить WCF.


Наконец, причина того, что channel.GetType() возвращает ICalculatory, происходит потому, что GetType() возвращает тип выполнения этого объекта. Отправляя IClientChannel, вы выполняете преобразование типа, которое гарантирует WCF.

+0

Спасибо, @vid. Вы мне рассказываете о том, как WCF реализует интерфейс контракта на обслуживание. Не могли бы вы объяснить, почему GetType() возвращает ICalculator? Я все равно не получаю его, если он возвращает точный тип времени выполнения объекта, на который ссылается, тогда он должен возвращать информацию о типе типа, созданного средой выполнения WCF. –