2016-07-12 1 views
1

私は一連のWCFサービスを構築しています。私が常にやるべきことの1つは、各操作の最後に応答メッセージを作成することです。
私は現在クラスを持っていますが、これらの作成メソッドは(30+以上)多数ありますが、Genericsでも同じことができると確信しています。次のようにGenericsを使用してこのコードをクリーンアップするにはどうすればよいですか?

方法の例のカップルです:

public ClientResponse CreateClientResponse(Header inboundHeader, ClientData data) 
    { 
     var response = new ClientResponse() { 
      Header = inboundHeader, 
      Data = data 
     }; 

     return response; 
    } 

    public OrderResponse CreateOrderResponse(GenericHeader inboundHeader, List<OrderData> data) 
    { 
     var response = new OrderResponse() { 
      Header = inboundHeader, 
      Data = data 
     }; 

     return response; 
    } 

ClientResponseOrderResponseが現在どのような方法で接続されていないが、両方ともよろしくメソッド/プロパティなどと同じように見える:

public class ClientResponse 
{ 
    public ClientResponse() 
    { 
     Header = new GenericHeader(); 
     Data = new ClientData(); 
    } 

    [DataMember(IsRequired = true)] 
    public GenericHeader Header { get; set; } 

    [DataMember(IsRequired = true)] 
    public ClientData Data {get; set;} 
} 

初めての試みでは、2つのプロパティを持つIResponse<T>を紹介し、レスポンスクラスに追加しました。

その後、
public interface IResponse<T> 
{ 
    GenericHeader Header { get; set; } 
    T Data { get; set; } 
} 

そして、私の一般的な方法であることを使用しますので、

var result = CreateResponse<ClientResponse, ClientData>(new GenericHeader(), new ClientData()); 

しかし...明らかに をジェネリックコード文句を言わない作業:

public TOut CreateResponse<TOut, TIn>(GenericHeader inboundHeader, TIn data) where TOut : new() 
{ 
    var response = new TOut(); 
    response.Header = inboundHeader; 
    response.Data = data; 
    return response; 
} 

だから私はようにそれを呼び出すことができますTOutHeaderDataプロパティについては認識していません。

私はここでインターフェイスを使用する必要があると思うが、私は失われていると私はTOutの具体的なクラスを返す方法を私はインターフェイス上で動作するように変更しているかわからない。

喜んでお寄せいただきありがとうございます。

+4

はあなたのような汎用的な方法、すなわちタイプ制約に何かをインタフェースを追加する必要はありません 'どこTOUT:新しい()、IResponse ' – stuartd

+0

うーん、間違って聞こえます。確かに、* specific *メッセージと非常に強く相関し、特定のタイプに依存しない応答。メッセージハンドラメソッドでレスポンスオブジェクトを返すようにしてください。 –

+1

「どこにTOut:IMyContract、new()」のように制約を追加しますか? –

答えて

0

ヘッダーの汎用引数を応答に追加します。ここで、有益なビルダー構文を使用したい場合があります(ここには含まれていません)。

public interface IResponse<TData,THeader> 
{ 
    THeader Header { get; set; } 
    TData Data { get; set; } 
} 

public TOut CreateResponse<TOut, TIn,THeader>(TIn data) 
    where TOut : IResponse<TIn,THeader>,new(), THeader: new() 
    => new TOut(){ Header = new THeader(), Data = data,}; 

var result = CreateResponse<ClientResponse, ClientData,GenericHeader>(new ClientData()); 
+0

母、私はまったく同じことを試そうとしていました! – Lukos

関連する問題