我已经将我的项目设置为使用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();
}
我希望这将帮助你解决你的问题。