WCF服务包装器 - 将endpointConfigurationName传递给服务客户端构造函数

时间:2010-08-24 11:16:02

标签: c# wcf

我有以下包装器来帮助我管理wcf客户端生命周期:

public class ServiceProxyHelper<TProxy, TChannel> : IDisposable
      where TProxy : ClientBase<TChannel>, new()
      where TChannel : class
   {
      private TProxy m_proxy;

      public TProxy Proxy
      {
         get
         {
            if (m_proxy != null)
            {
               return m_proxy;
            }
            throw new ObjectDisposedException("ServiceProxyHelper");
         }
      }

      protected ServiceProxyHelper()
      {
         m_proxy = new TProxy();
      }

      public void Dispose()
      {
          //....
      }
}

我正在以下列方式使用它:

   public class AccountServiceClientWrapper : ServiceProxyHelper<AccountServiceClient, IAccountService>
   {
   }

   public class Test()
   {
      using(AccountServiceClientWrapper wrapper = new AccountServiceClientWrapper())
      {
         wrapper.Proxy.Authenticate();
      }
   }

如何修改该代码以便为客户端提供 endpointConfigurationName

wrapper.Proxy.Endpoint.Name = "MyCustomEndpointName";

不工作。那个 endpointConfigurationName 应该是服务客户端构造函数的提供者,但是如何使用这个包装器呢?

此致

2 个答案:

答案 0 :(得分:2)

我会在TProxy构造函数中指定ServiceProxyHelper的实例。

protected ServiceProxyHelper(TProxy proxy)
{
  m_proxy = proxy;
}

然后,您的代理包装器类将如下所示:

public class AccountServiceClientWrapper : ServiceProxyHelper<AccountServiceClient, IAccountService>
{
private endpointCfgName = "{endpoint_here}";

public AccountServiceClientWrapper(): base(new AccountServiceClient(endpointCfgName))
        {
            //this.Proxy.ClientCredentials.UserName.UserName = "XYZ";
            //this.Proxy.ClientCredentials.UserName.Password = "XYZ";
        }
}

然后,你使用它的方式仍然完全相同。

当然,您需要从TProxy定义中删除"new"关键字

答案 1 :(得分:1)

也许您可以使用Activator.CreateInstance创建将endpointConfigurationName作为参数传递的代理实例。例如,

protected ServiceProxyHelper(string endpointConfigurationName )
{
  m_proxy = (TProxy)Activator.CreateInstance(typeof(TProxy), endpointConfigurationName);
}

这将是包装器中的一个额外构造函数,允许传递端点配置名称。只有在代理类型不支持此类构造函数的情况下才会出现缺陷,您将获得运行时异常而不是编译时错误。