.NET 5 IOptionsSnapshot:无法解析范围服务

Gab*_*ton 7 c# dependency-injection .net-5

当我尝试解析 IOptionsSnapshot 服务时,出现以下异常:

“无法从根提供程序解析范围服务“Microsoft.Extensions.Options.IOptionsSnapshot`1[Test.MyOptions]”。”

如果有人可以告诉我问题,我将测试代码留在下面。

主要的

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("AppSettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile("MyOptions.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();

        var services = new ServiceCollection();
        var provider = services.Configure<MyOptions>(configuration.GetSection(nameof(MyOptions))).BuildServiceProvider(true);

        var test = provider.GetRequiredService<IOptionsSnapshot<MyOptions>>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的选项类

public class MyOptions
{
    public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的选项.json

{
  "MyOptions": {
    "Value": 10
  }
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*kin 14

IOptionsSnapshot<T>注册为范围服务,这意味着您需要创建一个服务范围,然后使用该范围进行解析:

using (var scope = provider.CreateScope())
{
    var scopedProvider = scope.ServiceProvider;
    var test = scopedProvider.GetRequiredService<IOptionsSnapshot<MyOptions>>();

   //...
}
Run Code Online (Sandbox Code Playgroud)