您如何将数据传递给startup.cs?

这是用于使用WebHostBuilderTestServer的集成测试

我需要根据测试治具传递不同的数据。因此,例如,不想从配置文件中将其拉入

数据将提供给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/

10-11 12:11