c# - 如何在 Azure Service Fabric 应用程序中注入(inject) IHttpClientFactory?

标签 c# autofac azure-service-fabric asp.net-core-2.2

我尝试在解决方案中使用 IHttpClientFactory 而不仅仅是 HttpClient 的实例。

启动.cs:

services.AddHttpClient("Test", client =>
{
    client.BaseAddress = new Uri("http://localhost:57863");
    client.Timeout = new TimeSpan(0, 0, 30);
    client.DefaultRequestHeaders.Clear();
});

并且在我的服务中需要 HttpClient:

private readonly Uri _clusterLinuxUri;
private readonly IHttpClientFactory _clientFactory;
public LiasseService(ConfigSettings settings, IHttpClientFactory clientFactory)
{
    _clusterLinuxUri = new Uri($"{settings.LinuxClusterEndpoint}");
    _clientFactory = clientFactory;
}
public async Task<LiasseDetails> CreateLiasseAsync(LiasseCreate liasseData)
{
    using (var response = await _clientFactory.CreateClient("Test")
        .PostAsJsonAsync($"{_clusterLinuxUri}{_createPath}", liasseData))
    {
        await response.CheckHttpError($"{nameof(CreateLiasseAsync)} - error in CL");
        var detailsList = await response.Content.ReadAsAsync<LiasseDetailsList>();
        return detailsList.Details.FirstOrDefault();
    }
}

我还没弄清楚的是如何将它注入(inject)到Autofac中。

程序.cs

    private static void Main()
    {
        try
        {
            var builder = new ContainerBuilder();
            builder.RegisterModule(new GlobalAutofacModule());
            builder.RegisterServiceFabricSupport();
            builder.RegisterStatelessService<FacadeCore>("xxx.FacadeCoreType");

            using (builder.Build())
            {
                ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(FacadeCore).Name);
                Thread.Sleep(Timeout.Infinite);
            }
        }
        catch (Exception e)
        {
            ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
            throw;
        }
    }


    public class GlobalAutofacModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<ConfigSettings>();

            builder.RegisterType<PaymentService>().As<IPaymentService>();
            builder.RegisterType<MailerService>().As<IMailerService>();
            builder.RegisterType<LiasseService>().As<ILiasseService>();
            builder.RegisterType<AnalyseFinanciereService>().As<IAnalyseFinanciereService>();
            builder.RegisterType<ApimService>().As<IApimService>();

            builder.RegisterType<UserRepository>().As<IUserRepository>();
            builder.RegisterType<ApplicationProcessRepository>().As<IApplicationProcessRepository>();
            builder.RegisterType<LiasseRepository>().As<ILiasseRepository>();

            builder.RegisterType<CustomUserIdProvider>().As<IUserIdProvider>();
        }
    }

我是否应该创建一些实现IHttpClientFactory的自定义客户端以便能够注入(inject)它?我该怎么做?有什么例子吗?谢谢。

最佳答案

请参阅Interface documentation这里

所以回答你的问题:

1) 在“ConfigureServices”方法调用中使用 IServiceCollection .AddHttpClient()

2) 创建新的 Autofac 容器构建器并使用上面提到的 IServiceCollection 填充它

3) 从 ConfigureServices 方法返回新的 AutofacServiceProvider

public IServiceProvider ConfigureServices(IServiceCollection services)
{
   ...

   services.AddHttpClient();

   var containerBuilder = new ContainerBuilder();

   containerBuilder.Populate(services);

   var container = containerBuilder.Build();

   return new AutofacServiceProvider(container);
}

附注 确保添加 - Autofac.Extensions.DependencyInjection nuget 包,以便能够使用 AutofacServiceProvider 类。

关于c# - 如何在 Azure Service Fabric 应用程序中注入(inject) IHttpClientFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105476/

相关文章:

azure - EventGrid 与 EventHub

azure - 为什么应该使用 Service Fabric 反向代理而不是 Azure 应用程序网关与 SF 集群通信?

c# - 如何使用 Autofac 将 WCF 服务实现注入(inject)到另一个 WCF 服务中

azure - 创建 Service Fabric 应用程序后处理终止激活的应用程序主机

c# - C#在Excel文件中添加多个超链接的优化方式

c# - 在编译时不知道类型的情况下使用 Windsor 解析泛型接口(interface)?

asp.net-core - 利用 Serilog.AspNetCore 和 AutofacSerilogIntegration 通过 AspNetCore WebApp 从 .NET Core 类库解析 Microsoft.Extensions.Logging.ILogger

c# - 使用什么是组合 Autofac 和 Dapper 的首选方式

c# - 如何在 C# 中延迟加载 DataGridView

c# - 在没有第三方库的情况下从 JSoN 获取动态对象的最佳方法是什么?