ASP.NET Core 3.1 不会在实现 IPostConfigureOptions<T> 的类上调用 PostConfigure

Lea*_*ner 7 c# dependency-injection asp.net-core asp.net-core-3.1

在我的 ASP.NET Core 3.1 应用程序中,我想在最后做一些设置,因为它们依赖于仅在 Startup.cs 中注册的一些其他服务。有人可以帮助我理解为什么我的类实现IPostConfigureOptions<T>.NET Core 永远不会调用吗?

我有一个Options这样的课程:

public class MyTestOptions
{
    public string TestTest { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这在Startup.csConfigureServices方法中像往常一样使用。

services.Configure<MyTestOptions>(o => { o.TestTest = "Test Test Test"; });
Run Code Online (Sandbox Code Playgroud)

我需要“最后”更改一些设置。所以,我实现了IPostConfigureOptions<T>接口。实现类看起来像这样。(以下代码段中未显示 PostConfigure 方法)。

public class MyTestPostConfigure : IPostConfigureOptions<MyTestOptions>
Run Code Online (Sandbox Code Playgroud)

然后将其注册到Startup.csConfigureServices方法中,如下所示。

services.ConfigureOptions<MyTestPostConfigure>();
Run Code Online (Sandbox Code Playgroud)

我也尝试以不同的方式注册 PostConfig 类。

services.AddSingleton<IPostConfigureOptions<MyTestOptions>, MyTestPostConfigure>();
Run Code Online (Sandbox Code Playgroud)

但是,无论如何PostConfigure都不会调用 。我错过了什么吗?**

  1. 为什么 PostConfigure 永远不会执行?
  2. 所有 IPostConfigureOptions 在启动过程中都自动执行是不是真的?或者是否有任何情况下 .NET Core 选择在实际需要之前不运行它?**

Lea*_*ner 14

感谢@KirkLarkin 在对我的问题的评论中提供的意见。

未调用该类PostConfigure的方法MyTestPostConfigure,因为我没有访问MyTestOptions应用程序中任何位置的属性。

我已将其作为依赖项注入IOptions<MyTestOptions>到我的一个类中,这就是MyTestPostConfigure调用该类的构造函数的原因。但是,由于我没有使用MyTestOptions类中的任何内容,因此 .NET Core 没有调用PostConfigure方法。

一旦访问了类TestTest的属性MyTestOptions,我就看到 .NET Core 执行了ConfigurePostConfigure.

简而言之,and的执行是按需的,并且会延迟到您“实际使用”这些属性为止;仅将其作为依赖项注入并不会使 .NET Core DI 调用和方法。Configure<TOptions>IPostConfigureOptions<TOptions>TOptionsConfigurePostConfigure

(我不知道按需配置在任何地方都有记录,或者我完全错过了这个基本的事情..)

  • 我遇到了 IConfigureOptions 的另一个问题,但这篇文章导致了修复。将选项注入类时,请确保注入 IOptions&lt;YourClass&gt; 而不仅仅是 YourClass。否则,不会调用配置方法。谢谢! (2认同)