将 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>
不清楚为什么要在Startup
class中创建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();
}
希望本文能帮助您解决问题。
我已将我的项目设置为使用 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>
不清楚为什么要在Startup
class中创建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();
}
希望本文能帮助您解决问题。