我有一個使用完整的 Program 和 Startup 類(沒有頂級)的直接 .NET 6 應用程式。我在啟動中有以下部分:
IConfigurationSection oauthSection = Configuration.GetSection("OAuth");
services.Configure<OAuthSettings>(oauthSection);
var oauthSettings = oauthSection.Get<OAuthSettings>();
這是 OAuthSettings:
public class OAuthSettings
{
public OAuthSettings()
{
CorsAllowedOrigins = new List<string>();
}
public string BaseUrl { get; set; }
public string DefaultSchema { get; set; }
public IEnumerable<string> CorsAllowedOrigins { get; set; }
}
我正在IOptions<OAuthSettings>
從相鄰庫(但仍然是 DI 容器的一部分)的另一個類中注入物件,如下所示:
private readonly IOptions<OAuthSettings> _oAuthOptions;
public IdentityServerDataProtectionDbContext(
DbContextOptions<IdentityServerDataProtectionDbContext> options,
IOptions<OAuthSettings> oAuthOptions)
: base(options)
{
_oAuthOptions = oAuthOptions;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema(_oAuthOptions.Value.DefaultSchema);
}
但是,每次我嘗試呼叫_oAuthOptions.Value
時,所有屬性都是空的,并且實作是UnnamedOptionsManager
. 盡管事實上oauthSettings
在第一個片段中解決了設定就好了,這正在發生,這意味著它不是反序列化的問題。
有任何想法嗎?提前致謝。
uj5u.com熱心網友回復:
使用IOptionsSnapshot<>
或IOptionsMonitor<>
代替。
這花了我太多時間來弄清楚,所以我想在這里回答我自己的問題,希望能避免其他人的痛苦。
各種選項介面的檔案比我更好地解釋了這個問題(強調我的):
選項:
- 不支持:
- 應用啟動后讀取配置資料。
- 命名選項
- 注冊為單例,可以注入任何服務生命周期。
IOptions快照:
- 在每次注入解析度、作用域或瞬態生命周期中都應重新計算選項的情況下很有用。有關詳細資訊,請參閱使用 IOptionsSnapshot 讀取更新的資料。
- 已注冊為 Scoped,因此無法注入到 Singleton 服務中。
- 支持命名選項
選項監視器:
- 用于檢索選項和管理 TOptions 實體的選項通知。
- 注冊為單例,可以注入任何服務生命周期。
- 支持:
- 更改通知
- 命名選項
- 可多載配置
- 選擇性選項失效 (IOptionsMonitorCache)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530940.html
上一篇:GithubActions無法將AspDotNetCoreMVC6.0部署到AzureAppServiceLinux但顯示部署成功