Могу ли я использовать интерфейс в качестве типа в моем клиентском коде WCF? - PullRequest
0 голосов
/ 23 октября 2010

Я работаю над приложением Windows Phone 7, используя WCF для связи с моим сервером.

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

Например, в моем коде сервера у меня есть что-то вроде этого:

[OperationContract]
[ServiceKnownType(typeof(IField))]
[ServiceKnownType(typeof(TextField))]
[ServiceKnownType(typeof(NumberField))]
FieldForm GetForm();

Теперь моя FieldForm содержит следующую декларацию:

[DataContract]
class FieldForm
{
   public List<IField> Fields { get; set; }
}

И, наконец, этот интерфейс IField имеет несколько реализаций:

interface IField
{
   string Name { get; set; }
}

[DataContract]
class TextField : IField
{
}

[DataContract]
class NumberField : IField
{
}

(это не мой код, но описывает то, что я пытаюсь выполнить)

Теперь на моем клиенте я получаю объект FieldForm через WCF и хочу перебрать список полей, чтобы определить, какие элементы пользовательского интерфейса создать. Проблема в том, что служба не предоставляла интерфейс IField на клиенте, но у меня есть доступные реализации (TextField и NumberField).

Это приводит к некоторому дерьмовому коду в моем клиентском коде, например:

foreach ( object field in Fields )
{
   if ( field is TextField )
      // do textfieldy stuff
   else if (field is NumberField)
      // do numberfieldy stuff
}

, когда я действительно предпочел бы просто использовать:

foreach ( IField field in Fields )
{
   field.Name;
}

Мне не хватает простой аннотации на интерфейсе, чтобы сделать тип интерфейса доступным на клиенте, или WCF просто не предоставляет возможность сериализации интерфейсов?

Есть ли способ получить доступ к моему интерфейсу в коде моего клиента?

1 Ответ

1 голос
/ 23 октября 2010

Нет, вы не можете сериализовать интерфейс через соединение WCF.

WCF использует сериализованные (XML) сообщения для связи между клиентом и сервером - все, что вы можете выразить в XML-схеме (XSD), может быть перемещено. В основном это означает любой конкретный тип, состоящий из атомарных типов, таких как int, string и т. Д. XSD также поддерживает наследование и перечисления, но это конец флагштока.

Что вы могли бы сделать, если вы контролируете оба конца канала связи (например, и сервер, и клиент), так это поместить эти интерфейсы (сервисные интерфейсы и ваши контракты данных и интерфейсы) в общую, общую сборку, которая одновременно клиентский проект и серверный проект будут тогда ссылаться. Используйте любой класс, реализующий ваш интерфейс в конкретной реализации сервиса, но с этим совместным использованием сборок вы можете использовать понравившуюся подпись на стороне клиента и программировать для интерфейса. Имейте в виду: это «убивает» всю совместимость вашей службы WCF - никакие клиенты Ruby или Java больше не смогут вызывать вашу службу.

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