Объекты, возвращенные из службы WCF, не имеют свойств, только 'ExtentionData' - PullRequest
0 голосов
/ 27 февраля 2011

Я не новичок в веб-сервисах WCF, но с тех пор, как я в последний раз пользовался им, прошло несколько лет. Я уверен, что в прошлый раз, когда я использовал службу WCF, вы могли определить тип объекта, возвращаемого из вызова службы, при разработке кода. EG;

MyService.Models.ServiceSideObjects.User user = myServiceClient.GetUser();

После этого вы могли использовать объект «пользователь» на стороне клиента. Однако теперь кажется, что служба WCF не будет возвращать ничего, кроме объектов, содержащих базовые типы значений (string, int ect). До сих пор я исправлял это, определяя объекты переноса, которые содержат только эти базовые типы значений, и предоставляя сервису сопоставление свойств сложных объектов «Пользователь» с простыми строками и целыми числами в объекте переноса.

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

public class Ticket
{
    public Agent TicketAgent {get;set;}
    public Client Owner {get;set;}
    public PendingReason TicketPendingReason {get;set;}
}

Простое сопоставление этого графа объектов с одним классом передачи с огромным списком взаимосвязанных системных свойств дает очень «грязную» бизнес-модель на стороне клиента. Я ошибаюсь, думая, что ДОЛЖЕН быть в состоянии просто получить свой объект Ticket от вызова метода службы и обработать его на стороне клиента в том же состоянии, в котором он находился на стороне сервера?

Я понимаю, что это, вероятно, нарушение какого-то принципала SoA или аналогичного, но мое настольное приложение, в настоящее время использующее эту услугу, является ЕДИНСТВЕННОЙ вещью, которая будет потреблять ее когда-либо. Поэтому мне все равно, смогут ли многие другие клиенты управлять типами данных, возвращающимися из службы, и поэтому требуют какого-то чрезвычайно нормализованного возвращаемого объекта. Я просто хочу, чтобы мой сервис получал объект типа Ticket из своего хранилища, возвращал этот объект клиенту со всеми его неповрежденными свойствами. В настоящее время все, что я получаю, это объект с единственным свойством 'ExtentionData', которое невозможно использовать на стороне клиента.

Надеюсь, это имеет смысл, спасибо за ваше время.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2011

Возможно, я пропустил заметку, но я думаю, что вам нужно украсить ваши классы моделей с помощью DataContractAttribute, а ваши свойства - с помощью DataMemberAttribute, например:

[DataContract( Namespace = "http://example.com" )]
public class Ticket
{
    [DataMember]
    public Agent TicketAgent { get; set; }

    [DataMember]
    public Client Owner { get; set; }

    [DataMember]
    public PendingReason TicketPendingReason { get; set; }
}

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

Что касается ExtensionData, он используется для прямой совместимости: http://msdn.microsoft.com/en-us/library/ms731083.aspx

2 голосов
/ 27 февраля 2011

Я пометил ответ Niklas как ответ, поскольку он решил мою проблему.

Хотя кажется, что вам НЕ НУЖНО использовать [DataContract] и [DataMember], в некоторых случаях, я считаю, это можетпроблемы, которые я испытывал.При простой передаче пользовательских типизированных объектов, которые сами по себе имеют только типизированные свойства, атрибуты не требуются.Однако, когда я попытался перенести объект пользовательского типа, который сам по себе имел коллекции / поля с объектами большего количества пользовательских типов, потребовались атрибуты.

Спасибо за ваше время.

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