Alterar a propriedade DataMember no serviço web WCF dependendo da entrada / saída?
-
29-10-2019 - |
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?
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;