簡體   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