ASP.NET Core:如何在IServiceCollection扩展中通过Options取连接字符串注册DbContext
如何在扩展方法中从配置选项获取连接字符串并注册DbContext?
当然可以在这个层级实现你的需求,我给你两种可行的方案,其中第二种更贴合ASP.NET Core的DI最佳实践:
方案1:直接创建并配置Options实例
这种方式简单直接,先手动创建ServiceOptions实例并完成配置,再从中提取连接字符串注册DbContext,同时把配置好的实例注册到容器供其他服务使用:
public static IServiceCollection AddUniLocalizer(this IServiceCollection services, Action<ServiceOptions> setupAction) { // 创建Options实例并应用传入的配置 var serviceOptions = new ServiceOptions(); setupAction(serviceOptions); // 将配置好的Options注册为单例,供你的本地化服务(比如UniLocalizerFactory)依赖使用 services.AddSingleton(serviceOptions); // 如果你更习惯用ASP.NET Core的IOptions模式,也可以替换成下面这行: // services.Configure(setupAction); // 从Options中取出连接字符串,注册DbContext services.AddDbContext<LocalizerDbContext>(builder => builder.UseSqlServer(serviceOptions.ConnectionString)); // 注册你的本地化服务 services.AddSingleton<IStringLocalizerFactory, UniLocalizerFactory>(); services.AddSingleton<IStringLocalizer, UniLocalizer>(); return services; }
方案2:通过IServiceProvider延迟获取配置(推荐)
这种方式遵循ASP.NET Core的依赖注入设计原则,不会提前创建Options实例,而是在DbContext需要被初始化时,从服务容器中获取配置好的IOptions<ServiceOptions>:
public static IServiceCollection AddUniLocalizer(this IServiceCollection services, Action<ServiceOptions> setupAction) { // 先配置ServiceOptions,将其纳入ASP.NET Core的配置体系 services.Configure(setupAction); // 注册DbContext时,通过服务提供者获取配置 services.AddDbContext<LocalizerDbContext>((serviceProvider, builder) => { var options = serviceProvider.GetRequiredService<IOptions<ServiceOptions>>().Value; builder.UseSqlServer(options.ConnectionString); }); // 注册本地化服务 services.AddSingleton<IStringLocalizerFactory, UniLocalizerFactory>(); services.AddSingleton<IStringLocalizer, UniLocalizer>(); return services; }
注意事项
你在Startup.cs里写的opt.conncetionString有个拼写错误,应该是opt.ConnectionString(注意大小写和正确拼写),记得修正这个问题,否则会取不到配置值。
内容的提问来源于stack exchange,提问作者IT Man
相关产品推荐
相关产品推荐

