Pregunta

2 preguntas realmente, y no estoy seguro de si estoy haciendo esto bien o no ...

Quiero enviar una matriz de algún tipo para un objeto de entidad que creé. No estoy realmente seguro de cómo marcarlo para enviar (qué atributos son necesarios o lo que sea), y no estoy realmente seguro de cómo enviarlo (ilist, lista, colección, iCollection).

Idealmente, me encantaría poder enviar una vez en observación, pero eso funcionaría si un cliente que quiere consumir el servicio no está en .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
}
¿Fue útil?

Solución

Datacontract es lo que está buscando. Para más detalles, consulte esto Enlace

En el frente de colección observable, no estoy seguro de por qué enviar una matriz sería diferente para usted. ¿Puedes dar más detalles para ayudarnos a entender esto?

Otros consejos

Cuando se trata de pasar objetos sobre el cable, debe pensar en datos en lugar del comportamiento. Entonces, en lo que respecta a esto, una lista o ienumerable o t [] no diferiría y mi preferencia sería una matriz que se admite en todos los idiomas. El servidor no debe saber ni hacer ninguna suposición inncesiva sobre el cliente (WPF, los formularios de Windows, ...) y todo lo que está pasando es una colección de datos, por lo que menos prescriptivo es el mejor: t [] (matriz de t).

Como dijo Myermian, su ObservableCollection enviada sobre el cable no funcionaría como una Colectura Observable en el cliente.

También está utilizando MessageContract sin usar ninguno de sus beneficios del cuerpo/encabezado. Por lo tanto, debe usar DataContract.

El medio más interoperable sería devolver una matriz del tipo complejo, lo que sea que decida que sea. Mi preferencia personal es utilizar un objeto DTO dedicado para la transferencia a través del cable, en lugar de exponer entidades internas directamente a través del servicio.

Con respecto a ObservableCollection, Le sugiero que envuelva su matriz en un ObservableCollection del lado del cliente en lugar de intentar regresar ObservableCollection.

Manten eso en mente ObservableCollection no transmitirá los cambios nuevamente al servicio; Vas a ser para hacerlos manualmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top