【问题标题】:Read properties of options builder in IServiceCollection extension method在 IServiceCollection 扩展方法中读取选项生成器的属性
【发布时间】:2018-10-03 19:39:34
【问题描述】:

我在IServiceCollection 上有一个扩展方法,如下所示:

public static IServiceCollection AddMyProjData(this IServiceCollection services, Action<MyProjDataOptionsBuilder> optionsBuilder)
{
    services.Configure(optionsBuilder);

    services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
        .UseLazyLoadingProxies()
        .UseMySql("?????")
    );

    return services;
}

MyProjOptionsBuilder 类如下所示:

public class MyProjDataOptionsBuilder
{
    public string ConnectionString { get; set; }
}

如何在我的扩展方法中访问属性ConnectionString

我想做这样的事情:

var connectionString = optionsBuilder().ConnectionString;

PS。

我知道我可以直接将string 作为参数而不是Action 传递给扩展方法AddMyProjData。但在我的实际项目中,我需要设置更多的设置,而不仅仅是一个ConnectionString

我也喜欢使用Action 来配置服务的风格。

【问题讨论】:

    标签: c# asp.net-core asp.net-core-2.0 startup


    【解决方案1】:

    您可以在AddMyProjData 中创建MyProjDataOptionsBuilder 的实例,将optionsBuilder 应用于 实例,然后使用您需要的属性。

    这是一个例子:

    public static IServiceCollection AddMyProjData(
        this IServiceCollection services,
        Action<MyProjDataOptionsBuilder> optionsBuilder)
    {
        var myProjDataOptionsBuilder = new MyProjDataOptionsBuilder();
        optionsBuilder(myProjDataOptionsBuilder);
    
        services.Configure(optionsBuilder);
    
        services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
            .UseLazyLoadingProxies()
            .UseMySql(myProjDataOptionsBuilder.ConnectionString)
        );
    
        return services;
    }
    

    这里发生的事情有一些重复(调用optionsBuilder 两次),但我不认为这总体上会产生很大的成本。

    另一种方法是将您的配置时间和运行时选项分开 - 我怀疑您是否会在扩展方法内部以外的任何地方需要连接字符串本身,但我只是在这里猜测。


    从您在 OP 中展示的内容来看,我不相信 MyProjDataOptionsBuilder 是个好名字(我可能会选择 MyProjDataOptions),但这主要是暂时的。

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2018-01-24
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多