WebService: как вернуть массив сложного типа? - PullRequest
0 голосов
/ 31 августа 2010

2 На самом деле вопросы, и я не уверен, правильно ли я это делаю или нет ...

Я хочу отправить какой-то массив для созданного мною объекта Entity.Я не совсем уверен, как пометить его для отправки (какие атрибуты нужны или что-то еще), и я не совсем уверен, как отправить его обратно (IList, List, Collection, ICollection).

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

[ServiceContract(Namespace = "http://www.tempuri.com/MyService",
                 ConfigurationName = "IMyService")]
public interface IMyServie
{
    [OperationContract(Action = "http://www.tempuri.com/MyService/GetUsers",
                       ReplyAction = "*")]
    [XmlSerializerFormat(SupportFaults = true)]
    GetUsersResponse GetUsers(GetUsersRequest request);
}

[MessageContract(IsWrapped = false)]
public sealed class GetUsersRequest
{
    public GetUsersRequest() { }
    public GetUsersRequest(Int32 record = -1)
    {
        Record = record;
    }

    [MessageBodyMember(Namespace = "", Order = 0)]
    public Int32 Record { get; private set; }

}

[MessageContract(IsWrapped = false)]
//[ServiceKnownType(??)]
public sealed class GetUsersResponse
{
    public GetUsersResponse() { }
    public GetUsersResponse(PersonEntity[] entities)
    {
        Entities = entities;
    }

    [MessageBodyMember(Namespace = "", Order = 1)]
    //[XmlElement(DataType = "??")]
    public PersonEntity[] Entities { get; private set; }
    //Should this have been some other type of array-type (Collection, List, etc?)
}

//Does this need any attributes besides Serializable?
[Serializable()]
public PersonEntity : AbstractEntity
{
    public PersonEntity() { }
    public PersonEntity(Int32 id = 0, String fname = "", String lname = "")
    {
        ID        = id;
        FirstName = fname;
        LastName  = lname;
    }

    public String FirstName { get; set; }
    public String LastName { get; set; }

    //Functionality (Clone, Clear, Default, Equals, etc) Removed...
}

[Serializable()]
public abstract class AbstractEntity : IEntity
{
    public Int32 ID { get; set; }

    //Abstracts or Implements some functionality...
}

public interface IEntity
{
    //Defines functionality requirements
}

Ответы [ 3 ]

1 голос
/ 31 августа 2010

DataContract - это то, что вы ищете.Для получения более подробной информации проверьте эту ссылку

На фронте сбора данных Observable, не уверен, почему отправка массива будет для вас чем-то другим.Не могли бы вы рассказать немного подробнее, чтобы помочь нам понять это.

1 голос
/ 06 сентября 2010

Когда речь идет о передаче объектов по проводам, вы должны думать о данных, а не о поведении.Таким образом, что касается этого, List или IEnumerable или T [] не будут отличаться, и я бы предпочел массив, который поддерживается на всех языках.Сервер не должен знать или делать какие-либо ненужные предположения о клиенте (WPF, формы Windows, ...), и все, что вы передаете, - это набор данных, поэтому наименее предписывающим является лучший: T [] (Array of T).

Как сказал myermian, ваша ObservableCollection, отправленная по сети, не будет работать как ObservableCollection на клиенте.

Также вы используете MessageContract, не используя при этом никаких преимуществ Body / Header.Поэтому вы должны использовать DataContract.

0 голосов
/ 31 августа 2010

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

Что касается ObservableCollection, я предлагаю вам обернуть свой массив в ObservableCollection на стороне клиента, а не пытаться вернуть ObservableCollection.

Имейте в виду, что ObservableCollection не будет передавать изменения обратно в службу; Вы собираетесь сделать это вручную.

...