将数据传递给startup.cs

时间:2017-06-23 12:26:27

标签: c# .net-core

如何将数据传递到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中执行此操作以测试该概念,然后将转移到集成测试

任何想法我做错了什么?

有没有更好的方法将数据传入启动?

2 个答案:

答案 0 :(得分:5)

将数据发送到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可以使用常规注入方式来获取此

public Startup(IHostingEnvironment env, DataContainer data)
{
  // data.Test is available here and has the value that has been set in Main
}

注入当然可以在任何类和方法之后使用,而不仅仅是构造函数。

我不确定这是否比实际创建一个具有静态值的类更好,但是如果需要更改类,有时它可以变成一个接口,而另一个通常的注入有益。 / p>

答案 1 :(得分:5)

在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属性,然后可以使用Program.cs访问从.GetValue()传递的值。

Configuration.GetValue<TObjectType>("CustomProperty");