Наследование договоров в WCF - PullRequest
11 голосов
/ 05 августа 2011

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

Я думал определить базовый интерфейс и извлечь из них текущие интерфейсы WCF.

Например:

interface Base
{
    void BaseFoo();
    void BaseBar();
    ...
}

interface Child1:Base
{
    void ChildOperation1();
    ...
}

interface Child2:Base
{
    void ChildOperation2();
    ...
}

Сейчас у меня есть те операции запуска / остановки / очистки, которые определены в каждом дочернем интерфейсе.

Q Должен ли я извлечь аналогичную функциональность в базовый интерфейс или есть другие решения? Будут ли у меня проблемы с наследованием договоров в WCF?

1 Ответ

20 голосов
/ 05 августа 2011

Интерфейсы контрактов на обслуживание могут происходить друг от друга, что позволяет вам определять иерархию контрактов.Однако ServiceContract attribute is not inheritable:

[AttributeUsage(Inherited = false,...)]
public sealed class ServiceContractAttribute : Attribute
{...}

Следовательно, каждый уровень в иерархии интерфейса должен явно иметь атрибут Договора на обслуживание.

Иерархия договора на стороне обслуживания:

[ServiceContract]
interface ISimpleCalculator
{
    [OperationContract]
    int Add(int arg1,int arg2);
}
[ServiceContract]
interface IScientificCalculator : ISimpleCalculator
{
    [OperationContract]
    int Multiply(int arg1,int arg2);
}

Когда речь идет о реализации иерархии контрактов, один класс обслуживания может реализовывать всю иерархию, как и в классическом программировании на C #:

class MyCalculator : IScientificCalculator
{
    public int Add(int arg1,int arg2)
    {
        return arg1 + arg2;
    }
    public int Multiply(int arg1,int arg2)
    {
        return arg1 * arg2;
    }
}

Хост может предоставить единственную конечную точку для самого нижнего интерфейса виерархия:

<service name = "MyCalculator">
    <endpoint
    address = "http://localhost:8001/MyCalculator/"
    binding = "basicHttpBinding"
    contract = "IScientificCalculator"
    />
</service>

Вам не нужно беспокоиться об иерархии контрактов.Вдохновленный Книга Юваль Лоуи WCF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...