Frage

2 Fragen wirklich, und ich bin mir nicht sicher, ob ich das richtig mache oder nicht ...

Ich möchte ein Array einer Art für ein Entitätsobjekt zurücksenden, das ich erstellt habe. Ich bin mir nicht sicher, wie ich es zum Senden markieren soll (welche Attribute benötigt werden oder was auch immer), und ich bin mir nicht sicher, wie ich es zurücksenden soll (Ilist, Liste, Sammlung, Icollection).

Idealerweise würde ich gerne in der Lage sein, eine Beobachtung zurückzuschicken, aber würde das funktionieren, wenn ein Kunde, der den Dienst konsumieren möchte, nicht in .NET ist?

[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
}
War es hilfreich?

Lösung

Datacontract ist das, wonach Sie suchen. Weitere Informationen finden Sie unter Verknüpfung

Auf der beobachtbaren Sammlungsfront ist sich nicht sicher, warum das Senden eines Arrays für Sie unterschiedlich ist. Kannst du ein bisschen mehr näher erläutern, um uns das zu verstehen?

Andere Tipps

Wenn es darum geht, Objekte über den Kabel zu übergeben, müssen Sie sich eher an Daten als an Verhalten vorstellen. Soweit dies betrifft, würde eine Liste oder Ienumerable oder t [] nicht unterschiedlich sein, und meine Präferenz wäre ein Array, das in allen Sprachen unterstützt wird. Der Server sollte keine unkenner Annahme über den Client (WPF, Windows -Formulare, ...) kennen oder testen, und alles, was Sie übergeben, ist eine Sammlung von Daten, die am wenigsten vorgeschrieben sind: T [] (Array von T).

Wie Myermian sagte, würde Ihre Beobachtung, die über den Draht gesendet wurde, nicht als Beobachtung für den Kunden.

Außerdem verwenden Sie MessageContract, während Sie keinen seiner Vorteile von Körper/Header verwenden. Sie müssen also DataContract verwenden.

Die am stärksten operierbarsten Mittel wäre, ein Array des komplexen Typs zurückzugeben, was auch immer Sie entscheiden. Meine persönliche Präferenz ist es, ein dediziertes DTO -Objekt für die Übertragung über den Kabel zu verwenden, anstatt interne Entitäten direkt über den Dienst zu enthüllen.

Bezüglich ObservableCollection, Ich schlage vor, Sie wickeln Ihr Array in einen ein ObservableCollection Client-Seite, anstatt zu versuchen, zurückzukehren ObservableCollection.

Denk daran, dass ObservableCollection überträgt keine Änderungen an den Dienst zurück; Du gehst zu H Ave, um diese manuell zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top