在 IServiceCollection 扩展方法中读取选项生成器的属性

Read properties of options builder in IServiceCollection extension method

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

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

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

    return services;
}

class MyProjOptionsBuilder 看起来像这样:

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

如何在我的扩展方法中找到 属性 ConnectionString

我想做这样的事情:

var connectionString = optionsBuilder().ConnectionString;

PS.

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

多得多

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

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

这是一个例子:

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),但这主要是放在一边这里。