gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:10:20 25 4
gpt4 key购买 nike

我在 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;

附言。

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

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

最佳答案

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

关于c# - 在 IServiceCollection 扩展方法中读取选项生成器的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52634528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com