2

我有许多服务需要使用来自 HttpClientFactory 的类型化 HttpClient。虽然我可以解决一项服务,但我无法解决此服务的 IEnumerable。

interface IMyHttpClient
{
}

class MyHttpClient: IMyHttpClient
{
    public MyHttpClient(HttpClient client)
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        var services = new ServiceCollection();
        services.AddHttpClient()
                .AddHttpClient<IMyHttpClient, MyHttpClient>();

        var builder = new ContainerBuilder();
        // Exception goes away when remove this line
        builder.RegisterType<MyHttpClient>().As<IMyHttpClient>();
        builder.Populate(services);
        var provider = builder.Build();

        // ============== This works
        // provider.Resolve<IMyHttpClient>();

        // ============== This throws exception
        provider.Resolve<IEnumerable<IMyHttpClient>>();
    }
}

构造函数将被调用一次,然后抛出异常:

``` DependencyResolutionException:无法使用可用的服务和参数调用类型“ConsoleApp2.MyHttpClient”上的“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数:无法解析参数“System.Net.Http.HttpClient”构造函数'Void .ctor(System.Net.Http.HttpClient)'的客户端'。

```

问题是 AddHttpClient 添加了它自己的 IMyHttpClient 注册。但我只想使用 Autofac 注册!有没有办法使用类型化的客户端但仍然使用 Autofac?

4

1 回答 1

6

异常说明 Autofac 无法解析参数“System.Net.Http.HttpClient 客户端”。我想这是因为此类类型未在您的容器中注册以进行IMyHttpClient. 为了节省HttpClientFactory您可以注册显式构造函数参数的优势,例如:

static void Main(string[] args)
{
    var services = new ServiceCollection();
    services.AddHttpClient();

    var builder = new ContainerBuilder();
    // exclicit resolving client for constructor
    builder.RegisterType<MyHttpClient>().As<IMyHttpClient>().WithParameter(
        (p, ctx) => p.ParameterType == typeof(HttpClient), 
        (p, ctx) => ctx.Resolve<IHttpClientFactory>().CreateClient());

    builder.Populate(services);
    var provider = builder.Build();

    // ============== This works
    provider.Resolve<IMyHttpClient>();

    // ============== This works too
    provider.Resolve<IEnumerable<IMyHttpClient>>();
}

在此示例中,Resolve<IEnumerable<IMyHttpClient>>返回带有 single 的枚举IMyHttpClient,它是HttpClient从核心 HttpClientFactory 初始化的。

UPD:帖子由@norekhov 评论更新

于 2018-09-13T02:26:31.883 回答