如何将依赖注入与表示可组合行为的依赖项一起使用?

时间:2015-03-31 01:26:35

标签: c# dependency-injection composition

我正在编写一个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。

我发现这种方法存在两个问题:

  1. 每当我需要另一种行为组合时,我都需要为该特定组合创建一个新的接口和实现类。这确实成为命名每个新接口/实现的问题。
  2. 我觉得这是滥用类型系统。除名称外,接口本身完全相同。接口实际上只是IoC容器的配置标签。
  3. 理想情况下,我喜欢这样的事情(Foo和Bar是消息处理程序,即可组合行为):

    public class ServiceA
    {
        public ServiceA( IHttpClient< Foo, Bar > httpclient ) {}
    }
    

    对于以这种方式组成行为的类,是否有合理的方法来使用依赖注入?或者我应该朝不同的方向思考?

0 个答案:

没有答案