将 IOptions<T> 传递给启动配置中的方法

Passing IOptions<T> to method in StartUp Configuration

我已将我的项目设置为使用 IOptions 模式从 appSettings 文件中读取数据。

我有一个 class,它具有以下简单的构造函数:

public PlayClass(IOptions<MySettings> settings)
{
    _settings = settings;
}

在我的 ConfigureServices 方法中,我在此处设置了我的配置:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MySettings>(options => Configuration.GetSection("MyOptions").Bind(options));
}

当我 运行 或对此进行测试时,一切都按预期工作。但是,我需要在 ConfigureServices.

中调用我的游戏 PlayClass 中的方法

实现此目标的最佳方法是什么?

本来以为会这么简单:

public void ConfigureServices(IServiceCollection services)
{    
    var x = services.Configure<BitBucketSettings>(options => Configuration.GetSection("BitBucketOptions").Bind(options));

    var pc = new PlayClass(x);
    pc.MyMethod();

}

但这只会导致错误:cannot convert from IServiceCollection to IOptions<MySettings>

不清楚为什么要在Startupclass中创建class的对象。但是您可以通过以下方式解决您的问题。

IServiceCollection 仅用于创建依赖关系图,但要在运行时解决实际依赖关系,需要 ServiceProvider

要构建 ServiceProvider,需要在 ServiceCollection 上调用 BuildServiceProvider 方法。您可以在下面的代码中看到这一点。

public void ConfigureServices(IServiceCollection services)
{    
    //Register the configuration section in the service collection.
    services.Configure<BitBucketSettings>(Configuration.GetSection("BitBucketOptions");

    // Register the class in service collection.
    services.AddScoped<PlayClass, PlayClass>();

    // Build Service Provider
    var sp = services.BuildServiceProvider();

    // Resolve instance or PlayClass from service builder.
    var pc = sp.GetService<PlayClass>();

    //  Call method on instance of PlayClass
    pc.MyMethod();
}

希望本文能帮助您解决问题。