Использование структур с помощью служб WCF

Есть ли какая-либо официальная рекомендация по использованию структур как возвращаемых типов с услугами WCF?

В настоящее время я взаимодействую с сервисом, который я не пишу, и нахожу себя вдохновленным, чтобы спросить, оправдано ли мое раздражение.

В прошлом я всегда использовал классы - возможно, отчасти потому, что те образцы всегда показывают, но, как я думаю об этом сейчас, по другим "интуитивным" причинам:

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

  • Я использую LINQ много, поэтому тесты для nullability неявные с ссылочными типами, тогда как с structs и другими типами значений мне всегда нужно отмечать значение NULL.

Вот некоторые, которые приходят ко мне сразу, хотя я признаю это более интуитивным, чем маркированный список. Я решил задать вопрос, потому что я имею дело с сервисом, который возвращает структуры и должен писать при работе с возвращаемыми значениями:

var foo = Bar.Value.MyField;

вместо

var foo = Bar.Value;

Ответ 1

Если вы можете создать структуру и поместить на нее атрибут [DataContract] - используйте ее! Для WCF это не имеет значения - WCF требует только того, чтобы класс или структура, используемые с пометкой с атрибутом DataContract и всеми полями, которые должны быть включены в сериализованное сообщение, должны быть отмечены атрибутом [DataMember].

Если вы проверяете документы MSDN на DataContractAttribute, это показывает, что вы можете использовать его и в структуре:

[AttributeUsageAttribute(AttributeTargets.Class|
 AttributeTargets.Struct|AttributeTargets.Enum, 
 Inherited = false, AllowMultiple = false)]
public sealed class DataContractAttribute : Attribute

UPDATE: что касается того, когда использовать конструкцию вместо класса (в общем, в .NET), см. здесь этот вопрос:

Когда следует использовать структуру вместо класса?

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

Все преимущества общей .NET на самом деле не применяются в SOA-мире WCF, я бы сказал (вы не проходите вокруг экземпляров класса или структуры - см. выше).