我有以下包装器来帮助我管理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 应该是服务客户端构造函数的提供者,但是如何使用这个包装器呢?
此致
答案 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);
}
这将是包装器中的一个额外构造函数,允许传递端点配置名称。只有在代理类型不支持此类构造函数的情况下才会出现缺陷,您将获得运行时异常而不是编译时错误。