【问题标题】:ASP.NET Core - DI - Using Action<T> or IOption<T>ASP.NET Core - DI - 使用 Action<T> 或 IOption<T>
【发布时间】:2018-09-07 04:49:19
【问题描述】:

我试图了解使用 IOptions&lt;T&gt;Action&lt;T&gt; 之间的区别以及何时使用什么。

我有一个使用 IServiceCollection 扩展方法的库,我需要在其中配置我的服务以及配置 EF DbContext

示例:

namespace Microsoft.Extensions.DependencyInjection 
{
    public static void AddModule(this IServiceCollection services, IOptions<SomeOptionsClass> options) {
        services.AddDbContext<MyContext>(contextOptions => contextOptions.UseSqlServer(SomeOptionsClass.ConnectionString));
    }
}

如何从SomeOptionsClass 中获取ConnectionString 属性值?

【问题讨论】:

  • 不确定为什么这里需要 IOptions。提供更多上下文。应该能够从配置中获取连接字符串。 IOptions 用于将设置注入到类中
  • 我想要做的是允许某人管理他们自己的配置 (appsettings.json) 文件,但是在配置我的库时,我希望他们传递我的库所需的设置配置属性。跨度>
  • 我可以使用 Action 但是从动作中获取价值的正确方法是什么?调用该操作是正确的方法吗? actionOptions?.Invoke(变量); ?
  • 我完全不明白你到底在问什么(也许只是我自己)。如果您尝试重新加载配置数据,可以使用IOptionsSnapshot。但我不知道Action&lt;T&gt; 与这些有什么关系(或者即使您一直在指代Action&lt;T&gt;,或者您是否也在此处指代操作方法)。
  • 嗨@NightOwl888,我正在尝试了解如何最好地为我的扩展方法获取配置选项。我看过一些项目,例如 swagger 在 AddSwaggerGen 中使用 Action。我试图了解您为什么/何时使用 Action 而不是 IOptions

标签: c# asp.net-core dependency-injection extension-methods asp.net-core-2.0


【解决方案1】:

不知道为什么这里需要IOptions&lt;T&gt;

应该能够在启动期间从配置(appsetting)获取连接字符串。 IOptions&lt;T&gt; 通常用于将设置注入到类中

我建议简化 API 以期望连接字符串

namespace Microsoft.Extensions.DependencyInjection  {
    public static void AddModule(this IServiceCollection services, string connectionString) {
        services.AddDbContext<MyContext>(contextOptions => contextOptions.UseSqlServer(connectionString));
    }
}

这将使用户在配置模块时更加灵活。

例如,在组合根目录中的配置服务中,您可以访问配置并根据需要提取要使用的连接字符串

//...

services.AddModule(Configuration["Appsettings Key Here"]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多