gpt4 book ai didi

.net-core - IConfigureOptions 不创建范围选项

转载 作者:行者123 更新时间:2023-12-04 15:17:59 25 4
gpt4 key购买 nike

通常 Options是单例。但是,我正在从数据库构建选项,其中一个选项属性是密码,每个月都在更改。所以我想创建 Scoped选项的实例。我正在使用 IConfigureOptions<T>像下面这样从数据库构建选项

public class MyOptions
{
public string UserID {get;set;}
public string Password {get;set;
}

public class ConfigureMyOptions : IConfigureOptions<MyOptions>
{
private readonly IServiceScopeFactory _serviceScopeFactory;
public ConfigureMyOptions(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
}

public void Configure(MyOptions options)
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var provider = scope.ServiceProvider;
using (var dbContext = provider.GetRequiredService<MyDBContext>())
{
options.Configuration = dbContext.MyOptions
.SingleOrDefault()
.Select(x => new MyOptions()
{
UserID = x.UserID,
Password = x.Password
});
}
}
}
}

在 Controller 中使用它
    public class HomeController : BaseController
{
private readonly MyOptions _options;
public HomeController(IOptions<MyOptions> option)
{
_options = option.Value;
}

[HttpGet]
[Route("home/getvalue")]
public string GetValue()
{
// do something with _options here
return "Success";
}
}

我想创建一个 MyOptions 的实例对于每个新请求,请将其注册为 Scoped在启动.cs
services.AddScoped<IConfigureOptions<MyOptions>, ConfigureMyOptions>();

但是,当我将调试器放在 ConfigureMyOptions 的 Configure 方法中时,它只会在第一个请求中命中一次。对于下一个请求,容器返回相同的实例(如单例)。

我如何在此处设置范围以便为每个请求创建 MyOptions?

最佳答案

使用 IOptionsSnapshot而不是 IOptions在您的 Controller 中,它将根据请求重新创建选项。

为什么不能使用 IOptions :

.AddOptions Configuration API 的扩展方法注册 OptionsManager实例作为 IOptions<> 的单人

services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(OptionsManager<>)));
services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot<>), typeof(OptionsManager<>)));

OptionsManager类(class) uses caching internally :
 public virtual TOptions Get(string name)
{
name = name ?? Options.DefaultName;

// Store the options in our instance cache
return _cache.GetOrAdd(name, () => _factory.Create(name));
}

github 上的以下问题有助于找到上述问题: OptionsSnapshot should always be recreated per request

关于.net-core - IConfigureOptions<T> 不创建范围选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48914513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com