Как прокси-сервер WCF реализует ICommunicationObject, если его методы не видны?

Как канал WCF (созданный с помощью ChannelFactory) реализует ICommunicationObject, но не предоставляет, например, метод Close(), если только вы не приведете прокси-сервер к ICommunicationObject? Имеет ли это смысл?

Я думал об этом сегодня по дороге домой и не мог сообразить. Может я неправильно задаю вопрос? Может я глупый вопрос задаю? :)

Это какой-то трюк ниндзя?


person Alex Dresko    schedule 07.08.2012    source источник


Ответы (2)


Это делается с помощью явной реализации интерфейса.

Предположим, у вас есть интерфейс, например:

public interface IFoo
{
     void Foo();
}

Вы можете реализовать это нормально:

public class Bar : IFoo
{
     public void Foo() {} // Implicit interface implementation
}

Кроме того, вы можете реализовать члены интерфейса явно, что требует приведения:

public class Baz : IFoo
{
     void IFoo.Foo() {} // This will require casting the object to IFoo to call
}

Иногда это может быть очень полезно. Например, это часто делается для реализации IDisposable в классах, где предпочтительным API будет, например, вызов .Close(). Реализуя IDisposable явно, вы «скрываете» метод Dispose(), но по-прежнему позволяете использовать экземпляр класса с помощью оператора using.

person Reed Copsey    schedule 07.08.2012
comment
Спасибо, Рид и Дэн! Выигрывает первый пост. - person Alex Dresko; 08.08.2012

Класс Channel явно реализует интерфейс ICommunicationObject. Вот пример, демонстрирующий разницу между явной реализацией интерфейса и неявной реализацией интерфейса:

internal interface IExample
{
    void DoSomething();
}

class ImplicitExample : IExample
{
    public void DoSomething()
    {
        // ...
    }
}

class ExplicitExample : IExample
{
    void IExample.DoSomething()
    {
        // ...
    }
}

class Consumer
{
    void Demo()
    {
        var explicitExample = new ExplicitExample();
        // explicitExample.DoSomething(); <-- won't compile
        ((IExample)explicitExample).DoSomething(); // <-- compiles

        var implicitExample = new ImplicitExample();
        implicitExample.DoSomething(); // <-- compiles
    }
}

Вот ссылка на статью MSDN по этому вопросу: http://msdn.microsoft.com/en-us/library/ms173157.aspx

person Dan    schedule 07.08.2012