我正在编写一个ASP.NET Web Api Web服务,该服务需要对其他Web服务进行REST调用。 HttpClient类支持通过传入可以实现发送前和发送后功能的DelegatingMessageHandler来改变其行为。
我希望利用HttpClient的合成属性,根据我正在调用的Web服务添加各种行为。因此,类ServiceA知道它将要调用的外部服务需要添加到HttpClient的行为类型,而ServiceB类知道需要添加哪些行为。
我还想使用依赖注入来为ServiceA或ServiceB实例提供所需的HttpClient实例,以便可以轻松地模拟这些依赖项以进行单元测试。
我开始的道路是创建一个表示每组合成行为的接口类,以便我可以将接口直接放入服务类的构造函数中:
public interface IFooBarHttpClient
{
HttpResponseMessage SendAsync( HttpRequestMessage ); // etc
}
public class ServiceA
{
public ServiceA( IFooBarHttpClient httpclient ) {}
}
然后用一个继承自HttpClient的类实现该接口,并在调用基类构造函数时添加它所需的DelegatingMessageHandlers。
我发现这种方法存在两个问题:
理想情况下,我喜欢这样的事情(Foo和Bar是消息处理程序,即可组合行为):
public class ServiceA
{
public ServiceA( IHttpClient< Foo, Bar > httpclient ) {}
}
对于以这种方式组成行为的类,是否有合理的方法来使用依赖注入?或者我应该朝不同的方向思考?