代码之家  ›  专栏  ›  技术社区  ›  MakePeaceGreatAgain

解析需要HttpClient和字符串的服务

  •  1
  • MakePeaceGreatAgain  · 技术社区  · 6 月前

    我有以下课程:

    class MyClass(HttpClient client, string whatever) { }
    

    现在我想使用创建这个类的一个实例。NET DI容器:

    HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
    builder.Services.AddTransient<MyClass>();
    

    但我该如何通过 string -的论点 MyClass 例子

    1 回复  |  直到 6 月前
        1
  •  2
  •   Guru Stron    6 月前

    就我个人而言,我只想创建一个特殊的类型来容纳字符串:

    class MyService(HttpClient client, MyServiceSettings settings)
    {
        // use MyServiceSettings.Whatever
    }
    
    class MyServiceSettings
    {
        public string Whatever { get; set; }
    }
    

    通过以下注册(添加 Microsoft.Extensions.Http 以获得访问权限 AddHttpClient ):

    serviceCollection.AddSingleton(new MyServiceSettings { ... } ); // register correct value
    serviceCollection.AddHttpClient<MyService>(httpClient => ...); // will register MyService as transient
    

    或者,您可以研究工厂方法:

    serviceCollection.AddHttpClient("someName", httpClient => ...);
    serviceCollection.AddTransient(sp =>
        new MyService(
            sp.GetRequiredService<IHttpClientFactory>().CreateClient("someName"), 
            "{getYourString}"));
    

    实际上,该字符串在应用程序生存期内是静态的,它来自args,并包含每个对该实例的请求所使用的users令牌

    在某些情况下,您只需设置 HttpClient 本身,例如,如果令牌作为标头传递,则可以执行以下操作:

    serviceCollection.AddHttpClient<MyService>(httpClient =>
    {
        httpClient.DefaultRequestHeaders.Add("tokenHeaderName", "tokenValFromArgs");
    });