我有以下课程:

class MyClass(HttpClient client, string whatever) { }

现在我想在console—app中使用. NET DI容器创建这个类的实例:

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

但我如何将string参数传递给MyClass实例呢?

推荐答案

就个人而言,我会创建一个特殊的类型来保存字符串:

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,并且包含每个对该实例的请求所使用的用户令牌

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

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

Csharp相关问答推荐

在实际上是List T的 IESEARCH上多次调用First()是否不好?

C#将参数传递给具有变化引用的变量

如何使用C#和Graph API从Azure Directory获取用户详细信息

. NET 8使用COM向VB6公开

我需要两个属性类吗

System.Text.Json数据化的C#类映射

使用Audit.EntityFramework,我如何将外键的值设置为相关实体上的属性?

在调整大小的控件上绘制

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

如何向事件添加成员

C#多键字典和TryGetValue

VS 2022与VS 2019:如何/为什么创建额外的任务?

如何在发布NuGet包之前设置命名空间?

.NET Google Workspace API获取错误CS0266

将J数组转换为列表,只保留一个嵌套的JToken

映射器-如何映射到多个实体

如何在特定时间间隔运行多个后台任务?

在.Net 8 Visual Studio 2022中启用本机AOT发布时发布失败

在使用.NET EF Core DbContext属性之前,是否应使用null判断