将数据传递给startup.cs

Chr*_*sCa 8 c# .net-core

如何将数据传递到startup.cs?

这是使用集成测试WebHostBuilderTestServer

我需要根据测试夹具传递不同的数据.例如,所以不想从配置文件中提取它

数据将在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();
Run Code Online (Sandbox Code Playgroud)

但是当我在startup.cs中检查Configuration对象时,键不存在.并且只有startup.cs中定义的提供程序可用.

我正在尝试在program.cs中执行此操作以测试该概念,然后将转向集成测试

什么想法我做错了什么?

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

sal*_*uce 7

在 ASP.NET Core 3 中,您可以将信息作为配置的一部分进行传递。在 中Program.cs,添加.UseSettings()对配置键和值的调用并将其作为字符串传递。

Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder => {
        webBuilder.UseStartup<Startup>();
        webBuilder.UseSetting("CustomProperty", someProperty.ToString());
    })
Run Code Online (Sandbox Code Playgroud)

然后,在您的Startup.cs文件中,您应该会看到定义Configuration属性的构造函数。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

使用该Configuration属性,您可以访问从Program.csusing传递的值.GetValue()

Configuration.GetValue<TObjectType>("CustomProperty");
Run Code Online (Sandbox Code Playgroud)


Sam*_*nen 6

将数据发送到的Startup方法之一是注册服务Main.WebHostBuilder有一个ConfigureServices方法可以像ConfigureServices你可以在Startup类中实现的方法一样使用.

例如,您可以使用静态变量创建一个类(不是最好的想法,但可以工作)

public class DataContainer
{
   public static string Test;
}
Run Code Online (Sandbox Code Playgroud)

然后设置其值并将其添加为单例服务

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();
Run Code Online (Sandbox Code Playgroud)

在此之后你Startup可以使用常规注射方式来获得这个

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

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

我不确定这是否比实际创建一个具有静态值的类更好,但如果需要更改类,有时它可以被制作成接口和其他通常的注入优势.

  • 这不适用于 ASP.NET Core 3。您不能再将任意类型注入到 Startup 类构造函数中。 (3认同)

Ste*_*vie 6

该解决方案不再有效。想要全部大写,因为一开始我一直在努力让它工作,但没有看到@Beevik 的评论

我发现的最好方法是使用 UseStartup 的工厂方法而不是通用方法。

因此,UseStartup<Startup>()您不必获取自定义参数.UseStartup(x => new Startup(options))在哪里。options

更新: 此方法仅适用于 Net5 及更高版本