1

WCFプロキシの作成をWPFクライアントアプリケーションに一元化したいと思います。各プロキシの作成中に、プログラム固有のエンドポイント動作(ローカリゼーションヘッダーの追加など)を定義し、クライアント資格情報設定を定義したいと思います(UserNameクライアント資格情報でメッセージレベルのセキュリティを使用しています)。プロキシの作成は次のようになります。

public class ServiceChannelFactory
{
 public T CreateChannel<T, TService>() where T : ClientBase<TService>
 {
  var proxy = new T(bindingBuilder.GetBinding(), endpointBuilder.GetEndpointAddress()); //!!!
  proxy.Endpoint.Behaviors.Add(new LocalizationEndpointBehavior());
  proxy.ClientCredentials.UserName.UserName = applicationContext;
  proxy.ClientCredentials.UserName.Password = txtPassword.Password;
  return proxy;
 }
}

使用法は次のようになります。

var scp = new ServiceChannelFactory();
var proxy = scp.CreateChannel<MyServiceClient, ICustomerService>();
proxy.Open();
try
{
    proxy.CallService();
}
finally
{
    proxy.Close();
}

しかし、リフレクション(// !!!コメント行)を使用せずにプロキシオブジェクトを実際に作成する方法を理解することはできません。

MyServiceClientクラスは、VS> AddServiceReferenceによって生成されます。

この問題に対するベストプラクティスの解決策はありますか?

4

1 に答える 1

1

new() 制約を追加すると、パラメーターのないコンストラクターがあると仮定して、ジェネリック型のインスタンスを作成できます。

public class ServiceChannelFactory 
{ 
    public T CreateChannel<T, TService>() 
    where TService : class
    where T : ClientBase<TService>, new()
    { 
        var proxy = new T();

        //Configure proxy here

        return proxy; 
    } 
}
于 2010-01-20T16:02:25.767 に答える