如何在 ASP .NET 中的 configureServices 函数中获取连接字符串

我正在尝试使用身份服务来管理我的应用程序的登录。我有以下


let configureServices (services : IServiceCollection) =

    // Configure InMemory Db for sample application        

    services.AddDbContext<IdentityDbContext<IdentityUser>>(

        fun options ->        

            options.UseInMemoryDatabase("NameOfDatabase") |> ignore

        ) |> ignore

但是它使用内存数据库。我想保留用户注册信息,并且我有 postgresql 设置并想使用该数据库来保留信息。我在 settings.json 文件中有 connectionString 信息。我想把上面的函数改成这样:


let configureServices (services : IServiceCollection) =

    // Configure InMemory Db for sample application        

    services.AddDbContext<IdentityDbContext<IdentityUser>>(

        fun options ->        

            let config = ctx.GetService<IConfiguration>()

            let connString = config.Item("connectionString")

            options.UseNpgsql(connString) |> ignore

        ) |> ignore

但问题出在 configureServices 函数中,我无权访问处理应用程序配置的 Httpcontext(由上面的 ctx 表示)。我该怎么做呢?基本上我想从我的 configureServices 函数中的 settings.json 文件中获取 connectionString 字段的值。


BIG阳
浏览 319回答 3
3回答

繁星淼淼

希望您将以下代码行添加到您的 app.cofig 文件中。&nbsp; <connectionStrings>&nbsp; &nbsp; <add name="DefaultConnection"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;connectionString="Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" />&nbsp; </connectionStrings></configuration>其中存储了数据库连接字符串。在 ConfigureServices() 中,您可以访问配置对象,这使您可以从 app.config 文件访问应用程序连接字符串。public void ConfigureServices(IServiceCollection services){&nbsp; &nbsp; // Add framework services.&nbsp; &nbsp; services.AddDbContext<ApplicationDbContext>(options =>&nbsp; &nbsp; &nbsp; &nbsp; options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));}

互换的青春

我将假设您正在使用与以下类似的功能:WebHost&nbsp; &nbsp; .CreateDefaultBuilder(args)&nbsp; &nbsp; .ConfigureServices(Action<_> configureServices)&nbsp; &nbsp; .Configure(Action<_> configureApp)你会发现这个ConfigureServices方法有一个重载,它需要一个Action<WebHostBuilderContext, IServiceCollection>. 因此,您可以将函数更改为:let configureServices (context:WebHostBuilderContext) (services:IServiceCollection) =&nbsp; &nbsp; let config = context.Configuration&nbsp; &nbsp; let connString = config.GetConnectionString "DefaultConnection"&nbsp; &nbsp; services.AddDbContext<IdentityDbContext<IdentityUser>>(fun opts ->&nbsp; &nbsp; &nbsp; &nbsp; opts.UseNpgsql(connString) |> ignore&nbsp; &nbsp; &nbsp; &nbsp; ) |> ignore并将调用代码更改为此(注意Action<_>变为Action<_,_>):WebHost&nbsp; &nbsp; .CreateDefaultBuilder(args)&nbsp; &nbsp; .ConfigureServices(Action<_,_> configureServices)&nbsp; &nbsp; .Configure(Action<_> configureApp)

一只名叫tom的猫

看起来您正在使用一个Startup类来访问ConfigureServices(IServiceCollection services)方法中的配置。如果你从头开始创建这个类,它不会Configuration神奇地有一个可用的对象。您需要创建一个将被注入的构造函数,然后在某处存储对它的引用。默认情况下,它是这样完成的:public class Startup{&nbsp; &nbsp; public Startup(IConfiguration configuration)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Configuration = configuration;&nbsp; &nbsp; }&nbsp; &nbsp; public IConfiguration Configuration { get; }}现在,您可以在类的方法和其他方法中Configuration按预期使用该属性ConfigureServices:public void ConfigureServices(IServiceCollection services){&nbsp; &nbsp; services.AddDbContextFactory<IdentityDbContext<IdentityUser>>(options =>&nbsp; &nbsp; &nbsp; &nbsp; options.UseInMemoryDatabase(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Configuration.GetConnectionString("MyConnectionStringKey")));}
打开App,查看更多内容
随时随地看视频慕课网APP