WCF и интерфейсы по контрактам данных

При создании прокси-сервера WCF с использованием svcutil можно включить также интерфейсы, из которых наследуются контракты данных, например:

public class SomeType: ISometype
{
   public string Name { get; set; }
}

public interface ISometype
{
   public string Name { get; set; }
}

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

Можно ли делать то, что я пытаюсь сделать?

Ответы

Ответ 1

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

Теперь XML-схема ничего не знает о интерфейсах - все это касается конкретных, реальных типов. Для обычного сценария, в котором ваши клиенты могут быть чем угодно: от .NET до PHP до Ruby до (независимо от того), вам нужно обязательно указать все, что вы хотите отправить между клиентом и сервером, таким образом, который может быть представлен в XML-схемах - интерфейсах не могу. Поэтому нет никакого способа поддержать это в сценарии общего назначения.

Если вы контролируете оба конца провода, например. вы пишете как клиент, так и сервер, и как в .NET, так и вы можете сделать это:

  • поместите ваши DataContracts (и ваши сервисыContracts and OperationContracts и FaultContracts) в отдельную сборку MyServiceContracts

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