2012-02-22 13 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サービス実装プロジェクトに2つのクラス(RequestInput、RequestOutput)を作成します。 次に、必要なさまざまなプロパティに[DataMember]属性を追加し、無視する必要があるプロパティに対して[IgnoreDataMember]属性を追加します。

これは正しい方法ですか?

答えて

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; 
+0

デカップリングについて議論しましたが、WebサービスのRequestオブジェクトからモデルのRequestオブジェクトへの追加のマッピングによって、コードの重複が発生しているようです。 –

関連する問題