【问题标题】:Change DataMember property on WCF web service depending on input/output?根据输入/输出更改 WCF Web 服务上的 DataMember 属性?
【发布时间】:2012-02-22 13:04:56
【问题描述】:

场景:来自数据模型的实体被传递到具有各种信息的 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]。

这是正确的方法吗?

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

    • 我们最初确实讨论过解耦它,但是从 Web 服务 Request 对象到模型 Request 对象的额外映射似乎带来了一些代码重复。
    猜你喜欢
    • 2013-09-27
    • 2023-03-23
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多