1

我正在寻找使用供应商的 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 容器对服务代理泛型的使用进行单元测试,我无法将泛型类型限制为具体类型。

4

0 回答 0