Question

2 Questions vraiment, et je ne sais pas si je fais ce droit ou non ...

Je veux renvoyer un tableau d'une sorte pour un objet entité que j'ai créé. Je ne suis pas sûr de savoir comment marquer pour l'envoi (quels attributs sont nécessaires ou autre), et je ne suis pas vraiment sûr de savoir comment renvoyer (IList, Liste, Collection, ICollection).

Idéalement, j'aimerais pouvoir renvoyer un ObservableCollection, mais ça marcherait si un client qui veut consommer le service est pas dans .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
}
Était-ce utile?

La solution

DataContract est ce que vous recherchez. Pour plus de détails, consultez cette

Sur le front de collection Observable, ne sais pas pourquoi l'envoi d'un tableau serait différent pour vous. Pouvez-vous nous en dire un peu plus pour nous aider à comprendre cela.

Autres conseils

En ce qui concerne les objets passant sur le fil, vous devez penser à des données plutôt que sur le comportement. Donc, en ce qui concerne ce, une liste ou IEnumerable ou T [] ne changeraient pas et ma préférence serait rangée qui est pris en charge dans toutes les langues. Serveur ne devrait pas savoir ou faire aucune hypothèse unncessary sur le client (WPF, Windows Forms, ...) et tout ce que vous êtes de passage est un ensemble de données afin moins prescriptive est le meilleur. T [] (Array of T)

Comme myermian dit, votre ObservableCollection envoyé sur le fil ne serait pas travailler comme ObservableCollection sur le client.

Aussi, vous utilisez MessageContract tout de ne pas utiliser l'un de ses avantages de corps / tête. Vous devez donc utiliser DataContract.

Les moyens les plus intéropérables serait de retourner un tableau de type complexe, tout ce que vous décidez que d'être. Ma préférence personnelle est d'utiliser un objet DTO dédié pour le transfert à travers le fil, plutôt que d'exposer des entités internes directement par le service.

En ce qui concerne ObservableCollection, je vous suggère envelopper votre tableau dans un client côté ObservableCollection plutôt que d'essayer de revenir ObservableCollection.

Gardez à l'esprit que ObservableCollection ne transmettra pas les modifications dans le service; vous allez avoir en banque h pour faire cela à la main.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top