Генерация прокси WCF для интерфейса с сервером - PullRequest
1 голос
/ 11 октября 2009

Я создаю прокси WCF для моего контракта. Контракт содержит классы, которые реализуют Интерфейс. Сгенерированный прокси интерфейс пропал. поэтому я не могу его использовать.

Есть ли способ каким-то образом пометить интерфейс для генерации в файле прокси?

Вот пример контакта:

public interface IMyGeneralInterface
{    
   int? ID { get; set; }
}

[DataContract]
public abstract class EntityBase : IMyGeneralInterface
{        
  [DataMember]
  public virtual int? ID { get; set; }
}

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

Что мне делать?

Спасибо, Dani

Ответы [ 2 ]

3 голосов
/ 11 октября 2009

сообщения , которыми обмениваются клиент и сервер, должны быть конкретные классы, которые могут быть сериализованы и десериализованы между отправителем и получателем. Это делает практически невозможным отправку туда и обратно интерфейсов. Важно то, что вы обмениваетесь сообщениями между клиентом и сервером - НЕ объектов с информацией и поведением.

Все, что видит клиент, когда он импортирует описание службы, - это контракт данных типа "EntityBase" - он больше ничего не видит. Данные описаны в XML-схеме, а XML-схема не имеет концепцию интерфейсов.

Помните: WCF совместим - ваш клиент может быть клиентом PHP или Java, и они могут не поддерживать понятие интерфейсов.

Единственное, что вы могли бы сделать, если вы управляете обоими сторонами службы (и сервером, и клиентом), - это поместить ваши сервисы и контракты данных в их собственную сборку, а затем разделить эту сборку между клиентом и сервер. Таким образом, вы можете «транспортировать» больше информации о вашем сервисе и ваших контрактах на передачу данных между вашим клиентом и сервером, НО вы потеряете любые шансы на совместимость в процессе.

См. Эти сообщения в блоге для получения дополнительной информации о совместном использовании сборок между клиентом и сервером WCF:

Марк

0 голосов
/ 20 декабря 2011

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

public partial class GeneratedType : IMyGeneralInterface {}

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

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

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