Pergunta

2 Perguntas realmente, e eu não tenho certeza se estou fazendo isso certo ou não...

Eu quero enviar de volta uma matriz de algum tipo para uma Entidade objeto que eu criei.Eu não estou realmente certo de como marcar para o envio (que atributos são necessários ou o que quer), e eu não estou realmente certo de como enviá-lo de volta (IList, Lista, Coleção, ICollection).

Idealmente, eu gostaria de ser capaz de enviar uma ObservableCollection, mas teria que trabalhar, se um cliente que quer consumir o serviço não está em .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
}
Foi útil?

Solução

DataContract é o que você está procurando. Para mais detalhes, verifique isso link

Na frente da coleção observável, não sei por que o envio de uma matriz seria diferente para você. Você pode elaborar um pouco mais para nos ajudar a entender isso.

Outras dicas

Quando se trata de passar objetos sobre o fio, você deve pensar nos dados em vez de no comportamento. Portanto, no que diz respeito a isso, uma lista ou ienumerable ou t [] não diferiria e minha preferência seria uma matriz que é suportada em todos os idiomas. O servidor não deve conhecer ou fazer nenhuma suposição não terminada sobre o cliente (WPF, Windows Forms, ...) e tudo o que você está passando é uma coleção de dados, portanto, o menos prescritivo é o melhor: t [] (matriz de t).

Como o Myermian disse, sua observaLeCollection enviada pelo fio não estaria funcionando como uma observaBleCollection no cliente.

Além disso, você está usando o MessageContract e não usa nenhum de seus benefícios do corpo/cabeçalho. Portanto, você deve usar o DataCOntract.

O mais inter-operável meio seria retornar um array de tipo complexo, o que quer que você decida que ser.Minha preferência pessoal é usar um dedicado DTO objeto para a transferência de toda a fio, em vez de expor interno entidades directamente através do serviço.

Sobre ObservableCollection, Eu sugiro que você quebrar a sua matriz em uma ObservableCollection do lado do cliente em vez de tentar voltar ObservableCollection.

Tenha em mente que ObservableCollection não vai transmitir as alterações de volta para o serviço;você está indo para h ave para fazer essas manualmente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top