WCF и наследование интерфейса — это ужасно?

В моем приложении есть 2 «сервиса», скажем, один из них — базовый (целочисленный) калькулятор, а другой — калькулятор с плавающей запятой. Я выражаю их как интерфейсы следующим образом:

public interface IBasicCalculator
{
    int Add( int a, int b );
}

public interface IFloatingPointCalculator
{
    double Add( double a, double b );
}

Я хочу выставить их через WCF. К сожалению, WCF, похоже, очень тесно связан с представлением о том, что каждая возможная операция, которую вы хотите раскрыть, должна проходить через один единственный интерфейс службы — вы не можете совместно использовать сеансы между службами, это громоздко со стороны клиента, поскольку вам нужно создать отдельный прокси для каждого, вроде бы нет никаких "подсервисов" и т.д...

Итак, я понял, что мне нужно представить «комбинированный» интерфейс (можно также назвать его фасадом), например:

[ServiceContract]
public interface ICalculatorService : IBasicCalculator, IFloatingPointCalculator
{
    [OperationContract(Name = "AddInt")]
    new int Add( int a, int b );

    [OperationContract(Name = "AddDouble")]
    new double Add( double a, double b );
}

Если я это сделаю, то WCF предоставляет оба метода клиенту, который может их вызывать, и все это действительно работает.

Однако подобное «наследование интерфейсов» кажется неуклюжим. Особенно new int Add и new double Add. Строго говоря, new в методе указывает на скрытие базового метода, чего я на самом деле вообще не делаю. Я могу опустить new, но тогда я просто получаю предупреждения компилятора, которые сводятся к «Я думаю, что скрываю этот метод, вам нужно переименовать его в метод или добавить к нему «новый».

Итак, это вопрос из 2 частей:

  1. Я на правильном пути с моей логикой «объединить все в один интерфейс», или на самом деле есть способ предоставить «подсервисы» или «несколько связанных сервисов» с помощью WCF?

  2. Если это то, что нужно сделать, есть ли лучший способ?

Спасибо!


person Orion Edwards    schedule 22.01.2009    source источник


Ответы (3)


Я только что понял, что вы можете предоставить несколько конечных точек (каждая из которых использует другой интерфейс) для одной и той же службы, и вам все равно нужно создать только ОДНУ прокси-библиотеку на клиенте, которая дает доступ ко всем из них, что полностью решает мою проблему.

person Orion Edwards    schedule 22.01.2009

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

В общем, я бы не стал идти по этому пути, а скорее имел бы конкретные контракты, которые представляют собой логическую группу операций, которые вы хотите предоставить через конечную точку.

person casperOne    schedule 22.01.2009

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

WCF, безусловно, позволяет поддерживать несколько конечных точек, которые взаимодействуют с использованием уникальных URI и независимых контрактов. Однако тот факт, что класс ClientBase принимает, например, только один тип интерфейса контракта, в значительной степени подразумевает, что прокси-классы, даже если они хранятся в одной и той же библиотеке, по-прежнему должны четко реализовывать только один интерфейс контракта.

Если вам действительно удалось создать только одно определение прокси-класса, я хотел бы знать, как вам это удалось. Хотя, возможно, я неправильно понимаю ваши потребности. Реализация различных прокси-классов обеспечивает максимальную гибкость, поскольку значения OperationContractAtrribute, такие как IsInitiating и IsTerminating, скорее всего, будут разными для разных контрактов. Объединение интерфейсов двух контрактов, как в вашем примере, потенциально меняет способ атрибутирования методов в контракте службы.

person EnocNRoll - AnandaGopal Pardue    schedule 23.01.2009
comment
Между прочим, я использую интерфейс маркера в качестве основы для всех своих контрактов данных. Это позволяет мне в целом работать с контрактами данных в рамках моей структуры WCF. - person EnocNRoll - AnandaGopal Pardue; 24.01.2009
comment
Я только что использовал справочный инструмент визуальной студии для добавления службы - он сгенерировал одну клиентскую библиотеку - в этой библиотеке был один прокси-класс для каждой конечной точки (следовательно, много классов в одной библиотеке), но все классы проксируют один объект на сервере так что не важно что они разные - person Orion Edwards; 26.01.2009
comment
Круто, значит, вы реализуете более одного сервисного контракта в одном сервисе. Круто, это означает, что вашей камнем преткновения никогда не было количество прокси, а действительно количество сервисов, и теперь вы знаете, как выполнить то, что вы описываете. Прохладный. - person EnocNRoll - AnandaGopal Pardue; 26.01.2009