Pergunta

Cenário: uma entidade do modelo de dados é passada para um WCF Web Service com várias informações, salva em um banco de dados e depois retornada com o objeto totalmente preenchido com informações adicionais.

   public class Request
   {
    public virtual Guid RequestID { get; set; }
    public virtual string RequestType { get; set; }
    public virtual System.DateTime CreatedDate { get; set; }
    //More properties here populated from DB
   }

   [OperationContract]
   Request CreateRequest(Request input);

Neste exemplo, RequestID e CreatedDate são preenchidos apenas quando o registro é inserido no banco de dados e, portanto, não devem ser visíveis durante a solicitação inicial.Eles devem estar visíveis quando o objeto for retornado.

A abordagem atual que vamos seguir é criar duas classes (RequestInput, RequestOutput) em nosso projeto de implementação de serviço da web que herdam da entidade. Em seguida, adicionaremos atributos [DataMember] em várias propriedades que são obrigatórias e [IgnoreDataMember] naquelas que devem ser ignoradas.

Esta é a abordagem correta?

Foi útil?

Solução

Eu não diria que é uma forma correta ou incorreta.Mas é mais comum usar nomes semelhantes a

[DataContract]
Request{...}

e

[DataContract]
Response{...}

Idealmente, a Solicitação e a Resposta devem ser desacopladas da representação do modelo que você está usando no cliente e no servidor - ou seja, você tem uma fachada ou adaptador que os mapeia para o seu modelo a partir do seu código de serviço.

isso segue as linhas de como eu faria - mas isso é muito subjetivo e dependente do tamanho das entidades, etc. - você pode querer envolver um mapeador automático de alguma forma.

// higher level code
var entity = new Entity { properties we know before call };
// pass down to service layer 
var response = service.CreateRequest(new Request { Prop1 = entity.Prop1... } );
entity.RequestID = response.RequestId;
entity.CreatedDate = response.CreatedDate;

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