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

时间:2018-10-03 19:39:35

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

我在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来配置服务的样式。

1 个答案:

答案 0 :(得分: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一起使用),但这在这里基本上是一个空白。