我们如何在 .NET 5 控制台应用程序中使用 Autofac + Options 模式?
How can we use Autofac + Options pattern in a .NET 5 console application?
亲爱的。
我尝试在 Autofac 中使用选项模式,不幸的是我每次都遇到不同的错误,非常感谢任何类型的帮助或提示!
我尝试过的:
- 使用 ConfigurationBuilder 检索 IConfiguration/IConfigurationRoot。
- 使用之前创建的 IConfiguration/IConfigurationRoot 注册一个
TestSectionOptions
的实例:
builder.Register(c => config.GetSection("TestSection").Get<TestSectionOptions>());
- 正在尝试通过构造函数注入来注入它:
private readonly TestSectionOptions _options;
public DemoClass(IOptions<TestSectionOptions> options)
{
_options = options.Value;
}
我收到以下错误:
DependencyResolutionException: None of the constructors found with
'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type
'DemoApp.DemoClass' can be invoked with the available services and parameters:
Cannot resolve parameter
'Microsoft.Extensions.Options.IOptions1[DemoApp.TestSectionOptions] options' of constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions
1
当然,我尝试了其他类型的注册,但 none 成功了。
我也知道我可以简单地将配置文件绑定到一个 class,然后我注册并注入而不使用 IOptions<> 部分。但这将不再与期权模式完全对应,对吗?
即使它没有太大的区别,我仍然想知道为什么它不起作用以及如何让它起作用。
在此先感谢大家的帮助。
问题是这个 IOptions 类型应该在某处注册。
你可以看到例如this article。有个例子
public void ConfigureServices(IServiceCollection services)
{
services.Configure<PositionOptions>(Configuration.GetSection(
PositionOptions.Position));
services.AddRazorPages();
}
因此,在 Configure 扩展方法内部的某个地方,它注册了选项的类型,其中包括 IOptions<>。
因此,在您的情况下,您要么必须明确地执行此操作,例如
builder.Register(c => Options.Create(config.GetSection("TestSection").Get<TestSectionOptions>()))
这将注册 IOptions
或者,您可以创建一个空的服务集合,然后在其上调用 Configure 方法,然后将所有注册复制到 autofac 构建器 - 包“Autofac.Extensions.DependencyInjection”
中有 Populate 方法
亲爱的。
我尝试在 Autofac 中使用选项模式,不幸的是我每次都遇到不同的错误,非常感谢任何类型的帮助或提示!
我尝试过的:
- 使用 ConfigurationBuilder 检索 IConfiguration/IConfigurationRoot。
- 使用之前创建的 IConfiguration/IConfigurationRoot 注册一个
TestSectionOptions
的实例:builder.Register(c => config.GetSection("TestSection").Get<TestSectionOptions>());
- 正在尝试通过构造函数注入来注入它:
private readonly TestSectionOptions _options;
public DemoClass(IOptions<TestSectionOptions> options)
{
_options = options.Value;
}
我收到以下错误:
DependencyResolutionException: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'DemoApp.DemoClass' can be invoked with the available services and parameters: Cannot resolve parameter 'Microsoft.Extensions.Options.IOptions
1[DemoApp.TestSectionOptions] options' of constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions
1
当然,我尝试了其他类型的注册,但 none 成功了。 我也知道我可以简单地将配置文件绑定到一个 class,然后我注册并注入而不使用 IOptions<> 部分。但这将不再与期权模式完全对应,对吗? 即使它没有太大的区别,我仍然想知道为什么它不起作用以及如何让它起作用。
在此先感谢大家的帮助。
问题是这个 IOptions 类型应该在某处注册。
你可以看到例如this article。有个例子
public void ConfigureServices(IServiceCollection services)
{
services.Configure<PositionOptions>(Configuration.GetSection(
PositionOptions.Position));
services.AddRazorPages();
}
因此,在 Configure 扩展方法内部的某个地方,它注册了选项的类型,其中包括 IOptions<>。
因此,在您的情况下,您要么必须明确地执行此操作,例如
builder.Register(c => Options.Create(config.GetSection("TestSection").Get<TestSectionOptions>()))
这将注册 IOptions
或者,您可以创建一个空的服务集合,然后在其上调用 Configure 方法,然后将所有注册复制到 autofac 构建器 - 包“Autofac.Extensions.DependencyInjection”
中有 Populate 方法