私は一連の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;
}
ClientResponse
とOrderResponse
が現在どのような方法で接続されていないが、両方ともよろしくメソッド/プロパティなどと同じように見える:
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;
}
だから私はようにそれを呼び出すことができますTOut
はHeader
とData
プロパティについては認識していません。
私はここでインターフェイスを使用する必要があると思うが、私は失われていると私はTOut
の具体的なクラスを返す方法を私はインターフェイス上で動作するように変更しているかわからない。
喜んでお寄せいただきありがとうございます。
はあなたのような汎用的な方法、すなわちタイプ制約に何かをインタフェースを追加する必要はありません 'どこTOUT:新しい()、IResponse' –
stuartd
うーん、間違って聞こえます。確かに、* specific *メッセージと非常に強く相関し、特定のタイプに依存しない応答。メッセージハンドラメソッドでレスポンスオブジェクトを返すようにしてください。 –
「どこにTOut:IMyContract、new()」のように制約を追加しますか? –