如何在 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 中将选项模式与这些服务一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 2 的同一服务中将一些硬编码数据与 API 一起使用?

如何在 SQL Server 2017 中将“生成脚本”与图形数据库对象一起使用?

如何在 Azure 应用服务中将 X509Certificate2 与 WCF 一起使用

在 SwiftUI 中将 NavigationButton 与服务器请求一起使用

如何在 C# 中将 DLLImport 与结构一起用作参数?

如何在 QML 中将 @pyqtSlot 装饰器与其他装饰器一起使用?