你如何将数据传递到 startup.cs ?
这是用于使用WebHostBuilder
和TestServer
的集成测试
我需要根据测试夹具传递不同的数据。 所以不想从配置文件中提取它,例如
数据将提供给在 startup.cs 中注册的中间件
文档似乎建议这应该有效:
var configBuilder = new ConfigurationBuilder()
.AddInMemoryCollection(new[]
{
new KeyValuePair<string, string>("key", "value"),
});
var configuration = configBuilder.Build();
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseConfiguration(configuration) // config added here
.UseStartup<Startup>()
.Build();
host.Run();
但是当我检查 startup.cs 中的配置对象时,密钥不存在。 并且只有 startup.cs 中定义的提供程序可用。
我目前正尝试在 program.cs 中执行此操作以测试该概念,然后稍后再进行集成测试
任何想法我做错了什么?
有没有更好的方法将数据传递给启动?
在 ASP.NET Core 3 中,您可以将信息作为配置的一部分进行传递。 在Program.cs
中,添加对.UseSettings()
的调用并将配置键和值作为字符串传递。
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
webBuilder.UseSetting("CustomProperty", someProperty.ToString());
})
然后,在您的Startup.cs
文件中,您应该会看到定义Configuration
属性的构造函数。
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
...
}
使用该Configuration
属性,您可以使用.GetValue()
访问从Program.cs
传递的值。
Configuration.GetValue<TObjectType>("CustomProperty");
将数据发送到Startup
的一种方法是在Main
中注册服务。 WebHostBuilder
具有ConfigureServices
方法,可以像在Startup
类中实现的ConfigureServices
方法一样使用它。
例如,您可以使用静态变量创建一个类(不是最好的主意,但可以)
public class DataContainer
{
public static string Test;
}
然后设置其值并将其添加为单例服务
DataContainer.Test = "testing";
var host = new WebHostBuilder()
.ConfigureServices(s => { s.AddSingleton(typeof(DataContainer)); })
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseConfiguration(configuration) // config added here
.UseStartup<Startup>()
.Build();
在此之后,您的Startup
可以使用常规注入方式来获取它
public Startup(IHostingEnvironment env, DataContainer data)
{
// data.Test is available here and has the value that has been set in Main
}
此后,注入当然适用于任何类和方法,而不仅仅是构造函数。
我不确定这是否比实际创建一个具有静态值的类本身更好,但如果有时需要更改该类,它可以变成一个接口和其他通常的注入好处。
该解决方案不再起作用。 想要全部大写,因为一开始我一直在努力让它工作并且没有看到来自@Beevik 的评论
我发现最好的方法是使用工厂方法 UseStartup 而不是通用方法。
因此,您将得到.UseStartup(x => new Startup(options))
而不是UseStartup<Startup>()
,其中options
是自定义参数。
更新:此方法仅适用于 Net5 及更高版本
更多相关内容:请点击查看