根据输入/输出更改WCF Web服务上的DataMember属性?

时间:2012-02-22 13:04:57

标签: c# wcf web-services datamember data-members

场景:来自数据模型的实体将传递到具有各种信息的WCF Web服务,保存到数据库中,然后返回,并且该对象完全填充了其他信息。

   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,因此在初始请求期间不应显示。但是,当返回对象时,它们应该是可见的。

我们目前采用的方法是在我们的Web服务实现项目中创建两个类(RequestInput,RequestOutput),这些类继承自实体。 然后,我们将在所需的各种属性上添加[DataMember]属性,并在那些应该忽略的属性上添加[IgnoreDataMember]。

这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

我不会说这是正确或不正确的方式。但是更常见的是使用

行中的名称
[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;