Вопрос

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

Должен ли я

  1. Игнорируйте все операции, помещая [DataMemeber] только там, где это необходимо.

  2. Поместите рассматриваемый класс в сборку общей библиотеки для доступа как к клиенту, так и к серверу.

Спасибо, Роберто

PS.Я понимаю, что вопрос, вероятно, сформулирован не так хорошо, как мог бы быть.

Это было полезно?

Решение 2

Хорошо, получается комбинация всех вышеперечисленных ответов.

  1. Вставьте классы данных в общую сборку, на которую ссылаются как клиентский, так и серверный проекты.
  2. Убедитесь, что у вас установлен флажок "Типы повторного использования в ссылочных сборках" в диалоговом окне "Настройка ссылки на службу".
  3. В начале каждого из ваших контрактов с данными укажите атрибут [KnownType].

Код выглядит примерно так:

[DataContract]
[KnownType(typeof(WHS2SmugmugShared.Photo))]
[KnownType(typeof(WHS2SmugmugShared.PhotoInfo))]
public class Photo
{
//code here
}

В приведенном выше случае я использую PhotoInfo в классе Photo.PhotoInfo НЕ имеет связанного с ним атрибута KnownType в файле класса.И, похоже, это не требуется.

Это позволяет вам сериализовать сложные типы, но при этом сохранить их операции.

Другие советы

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

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

Наилучшая практика для контракта с данными заключается в том, чтобы это был контракт только с данными без какого-либо поведения.Второй наилучшей практикой для вас было бы украсить свой класс [DataMember] и сохранить его на сервере - позволить клиенту использовать копию прокси.

Краткий ответ:ДА.WCF обрабатывает сложные типы как чемпион.При передаче вашего сложного типа вы хотите сосредоточиться только на передаваемых данных.Если ваш клиент не использует совместно используемую библиотеку DLL, становится еще более важным сосредоточиться только на передаваемых данных (а не на каких-либо дополнительных операциях), потому что клиент получит только копию элементов данных сложного типа.

Я предполагаю, что вы работаете на Java?С помощью WCF вам нужно будет либо пометить поля атрибутами DataMember, либо (что еще лучше) изменить ваши методы get / set на properties.

Например, вместо:

[DataContract]
public class Foo
{
   [DataMember]
   private string bar;

   public string GetBar()
   {
      return bar;
   }

   public void SetBar(string b)
   {
      bar = b;
   }
}

Вы могли бы использовать следующее:

[DataContract]
public class Foo
{
   [DataMember]
   public string Bar { get; set; }
}

Украсьте все такие типы атрибутом serializable .Таким образом, вам не нужно размещать атрибут [DataContract] для каждого сложного класса, участвующего в вашей службе WCF.

Добавьте dll, содержащую эти типы, в WCF-клиент и позвольте прокси повторно использовать эти классы вместо регенерации тех, которые требуются для десерилизации.И если в proxy добавлен какой-либо тип, удалите его и используйте из библиотеки dll.Таким образом, я легко делился своими сложными типами с другими сервисами.Но это применимо только в том случае, если вы можете разделить свои типы как отдельные библиотеки dll.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top