在IServiceCollection扩展方法中读取选项构建器的属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在IServiceCollection扩展方法中读取选项构建器的属性相关的知识,希望对你有一定的参考价值。
我在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
来配置服务的风格。
我只想在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
),但这里大部分时间都在这里。
以上是关于在IServiceCollection扩展方法中读取选项构建器的属性的主要内容,如果未能解决你的问题,请参考以下文章
使用 IServiceCollection.AddTransient、IServiceCollection.AddSingleton 和 IServiceCollectionAddScoped 方法的
使用 IServiceCollection.AddTransient、IServiceCollection.AddSingleton 和 IServiceCollectionAddScoped 方法的
IServiceCollection.AddScoped,委托为异步操作
是否有与 IServiceCollection 的“TryAdd”方法等价的方法用于 IOptions<T> 模式?