2012-02-22 60 views
0

場景:來自數據模型的實體通過各種信息被傳遞到WCF Web服務中,並保存到數據庫中,然後返回對象,並完全填充其他信息。根據輸入/輸出更改WCF Web服務上的DataMember屬性?

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

我不會說這是一個正確或不正確的方法。但更通常使用的名字的東西沿着

[DataContract] 
Request{...} 

[DataContract] 
Response{...} 

行Request和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; 
+0

我們最初討論的是將它解耦,但從Web服務Request對象到Request對象模型的附加映射似乎引發了一些代碼重複。 – 2012-02-22 13:24:38