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



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

我试过了:

  1. 使用ConfigurationBuilder检索IConfiguration/iconfigationroot .
  2. 使用之前创建的IConfiguration/iconfigationroot注册一个TestSectionOptions的实例:builder.Register(c => config.GetSection("TestSection").Get<TestSectionOptions>());
  3. 试图通过构造函数注入注入:
private readonly TestSectionOptions _options;

public DemoClass(IOptions<TestSectionOptions> options)
{
_options = options.Value;
}

我得到以下错误:

DependencyResolutionException: None of constructors found with"Autofac.Core.Activators.Reflection。DefaultConstructorFinder'的类型"DemoApp。DemoClass'可以用可用的服务和参数调用:无法解析参数

Microsoft.Extensions.Options.IOptions1[DemoApp.TestSectionOptions] options' of constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions1

当然,我尝试了其他类型的注册,但它们都不起作用。我还知道,我可以简单地将配置文件绑定到一个类,然后注册并注入该类,而不需要使用IOptions<>部分。但这将不再完全符合期权模式,不是吗?即使没有太大的不同,我仍然想知道为什么它不起作用,以及我如何才能使它起作用。

问题是这个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构建器中—从包中有Populate方法"Autofac.Extensions.DependencyInjection">

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

相关内容

  • 没有找到相关文章