当您可以在没有 IServiceCollection 的配置方法的情况下进行 DI 设置时,它的目的是什么?

Nib*_*Pig 13 c# .net-5

我已经这样做了:

services.Configure<ApplicationSettings>(_configuration.GetSection("ApplicationSettings"));
Run Code Online (Sandbox Code Playgroud)

我以为这会让我注射ApplicationSettings,但显然不行。

我可以将GetSection(...)其注册为单例,但是那有什么意义呢.Configure

msdn 文档说“注册 TOptions 将绑定的配置实例,并在配置更改时更新选项。”

不过,目前尚不清楚如何设置模式以在我的应用程序中使用配置作为 DI。

这是我试图实现的SO问题:

如何在 .NET Core MVC 项目中转换 appsettings.json?

Vla*_*ykh 6

这正是为强类型设置部分配置依赖项注入ApplicationSettings.

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.Configure<ApplicationSettings>(_configuration.GetSection("ApplicationSettings"));

    // You can register your service
    services.AddTransient<SomeService>();
}
Run Code Online (Sandbox Code Playgroud)

然后,您实现该服务,并将设置部分自动注入其中。

public class SomeService
{
    private readonly IOptions<ApplicationSettings> _options;

    public SomeService(IOptions<ApplicationSettings> options)
    {
        _options = options;
    }

    public string AddPrefix(string value)
    {
        // AddPrefix("test value")
        // will return:
        // PREFIX - test value
        return $"{_options.Value.Prefix} - {value}";
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于您的ApplicationSettings定义为:

public class ApplicationSettings
{
    public string Prefix { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你的appsettings.json应该看起来像:

{
    "ApplicationSettings": {
        "Prefix": "PREFIX"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但与仅将 ApplicationSettings 注册为单例相比,有什么优势呢?我真的看不出有什么区别。IOptions 似乎有点复杂。 (11认同)