如何在 Startup 中将选项模式与这些服务一起使用?

Posted

技术标签:

【中文标题】如何在 Startup 中将选项模式与这些服务一起使用?【英文标题】:How to use the options pattern with these services in Startup? 【发布时间】:2021-07-20 11:55:31 【问题描述】:

在这个site 中解释了如何在 Startup.ConfigureServices() 中配置服务,但是如何将选项模式与使用 IServiceCollection 扩展的服务一起使用,例如 services.AddHttpClient() 或 services.AddDbContext()等。

例如,必须更改当前代码以使用选项模式:

services.AddDbContext<MyContext>(dbContextOptionsBuilder =>
      dbContextOptionsBuilder.UseSqlServer(myOptionsInstance.AString));

使用 DI 的选项模式示例:

public void ConfigureServices(IServiceCollection services)

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie();

    services.AddOptions<CookieAuthenticationOptions>(
                        CookieAuthenticationDefaults.AuthenticationScheme)
        .Configure<IMyService>((options, myService) =>
        
            options.LoginPath = myService.GetLoginPath();
        );

    services.AddRazorPages();

【问题讨论】:

您是问添加服务时如何提供配置值吗? @NoahStahl 是的,但不是像 services.AddSingleton(); 这样的常规服务.问题在于那些公开要初始化的特殊扩展方法的服务。 【参考方案1】:

ConfigureServices 中,您可以将bind 选项类实例添加到Startup 的构造函数注入IConfiguration 中的值。例如:

var myOptions = Configuration.GetSection("MyConfig").Get<MyOptions>();

假设此绑定成功,myOptions 应该具有可以作为服务参数提供的当前配置值。

services.AddDbContext<MyContext>(dbContextOptionsBuilder =>
      dbContextOptionsBuilder.UseSqlServer(myOptions.AString));

【讨论】:

我对 services.AddOptions().Configure() 方式更感兴趣,因为 MyOptions 由 DI 处理。 只有在您需要 OptionsBuilder 时才可以。如果你只是想获取初始化的配置值,绑定一个实例对我来说似乎很简单。 是的,我目前正在使用类似的绑定。是否不能将 AddOptions().Configure() 与这些 ICollectionServices 扩展一起使用? 不确定,但很好奇为什么需要这种特定方法? 带 DI 的选项模式

以上是关于如何在 Startup 中将选项模式与这些服务一起使用?的主要内容,如果未能解决你的问题,请参考以下文章