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



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

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

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>

不清楚为什么要在Startup类中创建类的对象。但你可以通过以下方式解决你的问题。

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();
}

我希望这将帮助你解决你的问题。

相关内容

  • 没有找到相关文章

最新更新