繁体   English   中英

"将数据传递给 startup.cs"

[英]Pass data to startup.cs

你如何将数据传递到 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();

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

我目前正尝试在 program.cs 中执行此操作以测试该概念,然后稍后再进行集成测试

任何想法我做错了什么?

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

将数据发送到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
}

注入当然适用于此后的任何类和方法,而不仅仅是构造函数。

我不确定这是否比实际创建一个具有静态值的类本身更好,但是如果该类有时需要更改,则可以将其制成接口和其他常见的注入好处。

在 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");

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

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

因此,您将得到.UseStartup(x => new Startup(options))而不是UseStartup<Startup>() ,其中options是自定义参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM