如何在.NET 5控制台应用程序中使用Autofac和Options模式?

5

我试图使用Autofac的选项模式,但每次尝试都导致错误。

我的尝试:

  1. 使用ConfigurationBuilder来检索IConfiguration/IConfigurationRoot。
  2. 注册TestSectionOptions的一个实例,使用之前创建的IConfiguration/IConfigurationRoot: builder.Register(c => config.GetSection("TestSection").Get<TestSectionOptions>());
  3. 尝试通过构造函数注入它:
private readonly TestSectionOptions _options;
    
public DemoClass(IOptions<TestSectionOptions> options)
{
    _options = options.Value;
}

我遇到了以下错误:
依赖解析异常:在类型“DemoApp.DemoClass”上未找到可用服务和参数的构造函数:无法解析构造函数参数“Microsoft.Extensions.Options.IOptions1 [DemoApp.TestSectionOptions] options”。 当然我也尝试了其他类型的注册方法,但都没有成功。我知道我可以简单地将配置文件绑定到一个类,然后注册并注入它而不需要IOptions <>部分。但那将不再完全对应于选项模式,对吧? 即使这没有太大的区别,我仍然想知道为什么它不起作用以及如何让它起作用。

这个回答解决了你的问题吗?如何在ConfigureServices方法中获取IOptions? - cassandrad
很遗憾,你的示例不适用于Autofac,因为它使用了Microsoft.Extensions.DependencyInjection,我认为这个库在幕后做了一些我不知道的事情,但还是非常感谢!我觉得我走在正确的轨道上! 我可以让我的类实现IConfigureOptions<TOptions>/IConfigureNamedOptions<TOptions>,但我仍然不确定是否正确。我会尝试一下,如果找到了合适的方法就回复。 - MergimAgain
“但这将不再完全对应选项模式,是吗?” 什么是选项模式?我的意思是,如果您在构造函数中直接编写options = options.Value,那么您使用此模式的优势是什么? - Viktor Arsanov
例如,如果设置无效,它可能会抛出异常,或者如果您进行验证,但在构造函数中取消引用它将没有任何区别。顺便说一句,我真的看不出它带来了什么优势,除了验证之外 - 更糟糕的是 - 它似乎支持设置值更改,但实际上只是看起来像这样,但实际上您必须使用IOptionsSnapshot或IOptionsMonitor。也就是说,它有点令人困惑。 - Viktor Arsanov
你说得完全正确,@ViktorArsanov,非常感谢你的回答。但正如我上面提到的,我对差异并不感兴趣,我只想知道如何解决它以及问题出在哪里,我只是真的很好奇! - MergimAgain
1个回答

6
问题在于这个 IOptions 类型应该被注册到某个地方。
您可以查看例如此文章中的示例。
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 方法。

https://autofac.org/apidoc/html/B3162450.htm


Options.Create是我一直在寻找的,谢谢。 - AFract

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接