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

时间:2018-07-04 03:17:57

标签: c# asp.net f# f#-giraffe

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

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字段的值。

3 个答案:

答案 0 :(得分:3)

希望您将以下代码行添加到您的app.cofig文件中。

    

  <connectionStrings>
    <add name="DefaultConnection"
         connectionString="Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" />
  </connectionStrings>
</configuration>

其中存储了数据库连接字符串。 在ConfigureServices()中,U可以访问配置对象,该对象使您可以访问来自app.config文件的应用程序连接字符串。

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}

有关更多详细信息:-Click Here

答案 1 :(得分:3)

我将假定您正在使用与以下类似的功能:

WebHost
    .CreateDefaultBuilder(args)
    .ConfigureServices(Action<_> configureServices)
    .Configure(Action<_> configureApp)

您会发现此ConfigureServices方法的重载占用了Action<WebHostBuilderContext, IServiceCollection>。因此,您可以将功能更改为此:

let configureServices (context:WebHostBuilderContext) (services:IServiceCollection) =
    let config = context.Configuration
    let connString = config.GetConnectionString "DefaultConnection"

    services.AddDbContext<IdentityDbContext<IdentityUser>>(fun opts ->
        opts.UseNpgsql(connString) |> ignore
        ) |> ignore

并将调用代码更改为此(注意Action<_>变成Action<_,_>):

WebHost
    .CreateDefaultBuilder(args)
    .ConfigureServices(Action<_,_> configureServices)
    .Configure(Action<_> configureApp)

答案 2 :(得分:0)

看起来您正在使用 Startup 类,您想在其中访问 ConfigureServices(IServiceCollection services) 方法中的配置。

如果你从头开始创建这个类,它不会有一个神奇的 Configuration 对象。您需要创建一个将被注入的构造函数,然后在某处存储对它的引用。默认情况下,it is done like this

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }
}

现在您可以在您的 Configuration 和类的其他方法中按预期使用 ConfigureServices 属性:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContextFactory<IdentityDbContext<IdentityUser>>(options =>
        options.UseInMemoryDatabase(
            Configuration.GetConnectionString("MyConnectionStringKey")));
}
相关问题