在IServiceCollection扩展方法中读取选项构建器的属性

问题描述 投票:1回答:1

我在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个回答
1
投票

我只想在MyProjDataOptionsBuilder中创建一个AddMyProjData实例,对该实例应用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),但这里大部分时间都在这里。

© www.soinside.com 2019 - 2024. All rights reserved.