我在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
来配置服务的样式。
答案 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
一起使用),但这在这里基本上是一个空白。