您如何将数据传递给startup.cs?
这是用于使用WebHostBuilder
和TestServer
的集成测试
我需要根据测试治具传递不同的数据。因此,例如,不想从配置文件中将其拉入
数据将提供给startup.cs中已注册的中间件
Docs似乎建议这样做:
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中检查Configuration对象时,键不存在。而且只有在startup.cs中定义的提供程序可用。
我目前正在尝试在program.cs中执行此操作,以测试概念,然后稍后将进行集成测试
有任何想法我在做什么错吗?
有没有更好的方法将数据传递给启动?
最佳答案
将数据发送到Startup
的一种方法是在Main
中注册服务。 WebHostBuilder
具有ConfigureServices
方法,可以像可以在ConfigureServices
类中实现的Startup
方法一样使用。
例如,您可以使用静态变量创建类(不是最好的主意,但是可以工作)
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
就可以使用常规注入(inject)方式来获取此信息public Startup(IHostingEnvironment env, DataContainer data)
{
// data.Test is available here and has the value that has been set in Main
}
当然,此后的注入(inject)当然适用于任何类和方法,而不仅限于构造函数。
我不确定这是否比实际单独创建具有静态值的类更好,但是如果有时需要更改该类,则可以将其转变为接口(interface),并获得其他通常的注入(inject)好处。
关于c# - 将数据传递给startup.cs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44721426/