我正在寻找使用供应商的 SOAP API 并通过我们自己的统一 WCF 实现公开它。由于我无法控制源服务接口,因此我不得不使用服务引用和代码生成客户端类。
这些客户端类之一的示例
public partial class CompanyApiSoapClient : System.ServiceModel.ClientBase<Cwx.Repository.ConnectWise.CompanyService.CompanyApiSoap>, Cwx.Repository.ConnectWise.CompanyService.CompanyApiSoap
为了通用处理对不同服务的调用,我采用了以下通用代理方法:
public class ServiceClientProxy<TChannel> : IServiceClientProxy<TChannel> where TChannel : ICommunicationObject
{
private readonly TChannel _innerChannel;
public ServiceClientProxy(TChannel innerChannel)
{
_innerChannel = innerChannel;
}
public TResult Execute<TResult>(Func<TChannel, TResult> operation)
{
var result = default(TResult);
try
{
if (_innerChannel.State != CommunicationState.Opened)
{
_innerChannel.Open();
}
result = operation(_innerChannel);
}
catch (CommunicationException)
{
_innerChannel.Abort();
}
catch (TimeoutException)
{
_innerChannel.Abort();
}
catch (Exception)
{
_innerChannel.Abort();
throw;
}
return result;
}
public void Dispose()
{
_innerChannel.Close();
}
}
这就是我的问题。为了让我的代理泛型工作,TChannel 需要实现 ICommunicationObject。我没有从 CompanyApiSoap 接口中获得该实现,而是从具体的 ClientBase 通用实现中获得。自然,如果我想通过 IoC 容器对服务代理泛型的使用进行单元测试,我无法将泛型类型限制为具体类型。