【问题标题】:How can we use Autofac + Options pattern in a .NET 5 console application?我们如何在 .NET 5 控制台应用程序中使用 Autofac + Options 模式?
【发布时间】:2021-08-20 11:41:42
【问题描述】:

亲爱的。

我尝试将选项模式与 Autofac 一起使用,不幸的是我每次都遇到不同的错误,非常感谢任何帮助或提示!

我尝试过的:

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

我收到以下错误:

DependencyResolutionException:找不到任何构造函数 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 类型 可以使用可用的服务和参数调用“DemoApp.DemoClass”: 无法解析参数 'Microsoft.Extensions.Options.IOptions1[DemoApp.TestSectionOptions] options' of constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions1

当然,我尝试了其他类型的注册,但都没有成功。 我也知道我可以简单地将配置文件绑定到一个类,然后我在没有 IOptions 部分的情况下注册和注入。但这将不再与选项模式完全对应,不是吗? 即使它没有太大的不同,我仍然想知道它为什么不起作用以及如何让它起作用。

我提前感谢大家的任何帮助。

【问题讨论】:

  • 这能回答你的问题吗? How to get IOptions in ConfigureServices method?
  • 不幸的是,它不能直接适用于 Autofac,您的示例使用的是 Microsoft.Extensions.DependencyInjection,这(我认为)正在做一些我错过的事情,但非常感谢!我认为我在正确的轨道上!我可以让我的班级实现IConfigureOptions&lt;TOptions&gt;/IConfigureNamedOptions&lt;TOptions&gt;,但我仍然不能 100% 确定。如果找到合适的方法,我会尝试并回复。
  • “但那将不再与选项模式完全对应,不是吗?”什么是期权模式?我的意思是,如果你在构造函数中直接写 options = options.Value,你会利用这种模式的什么优势?
  • 例如它可能会为无效设置抛出异常,或者,如果您有验证,但如果您在构造函数中取消引用它,它不会有任何区别。顺便说一句,我真的看不出它带来了什么好处,除了验证 - 更糟糕的是 - 它看起来可能支持设置值更改,但看起来确实如此,但实际上你必须使用 IOptionsSnapshot 或 IOptionsMonitor。 IE。有点混乱。
  • 你是完全正确的@ViktorArsanov,非常感谢你的回答。但正如我上面提到的,我对差异不感兴趣,我只想知道如何解决它以及问题是什么,我真的很好奇!

标签: c# autofac options


【解决方案1】:

问题是这个 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 builder - 包“Autofac.Extensions.DependencyInjection”中的 Populate 方法

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2019-05-18
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多