Изменить свойство DataMember на веб-сервис WCF в зависимости от ввода / вывода? - PullRequest
0 голосов
/ 22 февраля 2012

Сценарий. Объект из модели данных передается в веб-службу WCF с различной информацией, сохраняется в базе данных, а затем возвращается обратно с объектом, полностью заполненным дополнительной информацией.

   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);

В этом примере RequestID и CreatedDate заполняются только тогда, когда запись вставлена ​​в базу данных, и, следовательно, не должны быть видны во время первоначального запроса.Однако они должны быть видны при возврате объекта.

Текущий подход, который мы используем, заключается в создании двух классов (RequestInput, RequestOutput) в нашем проекте реализации веб-службы, которые наследуются от сущности.Затем мы добавим атрибуты [DataMember] для различных требуемых свойств, а атрибуты [IgnoreDataMember] - для тех, которые следует игнорировать.

Это правильный подход?

1 Ответ

1 голос
/ 22 февраля 2012

Я бы не сказал, что это правильный или неправильный путь.Но более привычно использовать имена что-то вроде

[DataContract]
Request{...}

и

[DataContract]
Response{...}

. Запрос и ответ в идеале должны быть отделены от представления модели, которое вы используете в клиенте.и сервер - то есть у вас есть фасад или адаптер, который отображает их в вашу модель из вашего сервисного кода.

это похоже на то, как я бы это сделал - но это очень субъективно зависит от размера объектови т. д. - возможно, вы захотите подключить авто-маппер.

// 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;
...