【问题标题】:Dynamic connection strings appsettings.json Asp.NetCore动态连接字符串 appsettings.json Asp.Net Core
【发布时间】:2020-08-04 23:07:57
【问题描述】:

我是这个 API 开发的新手,所以我有下一个问题。

是否可以在运行时为我的连接字符串获取数据库名称?这是因为用户将通过 Json 文件发送数据库名称。 我正在使用 Visual Studio 2019、NetCore 3.1。

我的 appsettings.json 是这样的:

"ConnectionStrings": {
    "ImportConnection": "Data Source=SQLSERVER;Initial Catalog={dbName};User ID=Id;Password=Pass;MultipleActiveResultSets=True"
  },

我在 configureservices 中的 Startup.cs 我有这个

services.AddDbContext<ApplicationDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ImportConnection")));

用户发送一个带有下一个结构的 Json 文件

{
    "ImportTypeId": 1,
    "Data": [
        {
            "LayoutID": 6,
            "ClientID": "XXX",

其中 ClientID 是数据库名称。

我真的很想知道是否有办法将我的 connectionString 中的 Initial Catalog {dbName} 替换为 ClientID 值。

这也是我的 DbContext

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace API_Test.Models
{
    public class ApplicationDBContext : IdentityDbContext<ApplicationUser>//DbContext
    {
        public ApplicationDBContext(DbContextOptions<ApplicationDBContext> options) : base(options)
        {

        }
        public DbSet<DataModel> API_DATA { get; set; }
    }
}

非常感谢

【问题讨论】:

  • 根据您的描述,我无法清楚地理解您的要求。你的意思是你的应用程序中有多个连接字符串?就像每个用户都会包含他自己的连接字符串?另外,由于appsetiting.json是一个文件,不支持多线程修改。所以当有大量请求发送到您的服务器时,我们无法修改应用设置。
  • 您能否更具体地说明“用户将通过 Json 文件发送数据库名称”这一说法。这是否意味着用户将通过命令行参数将 json 文件发送到应用程序。
  • @BrandoZhang 感谢您的评论,我只有一个连接字符串。用户在同一台​​服务器上有多个数据库,如果他想将信息导入到 DB A,然后再导入到 DB B,他想发送 DB 名称来使用。我正在考虑在运行时改变它。不知道有没有可能。
  • @DurgaPrasad 感谢您的评论,是的,用户将通过命令行参数发送 json fike

标签: api asp.net-core dynamic connection-string appsettings


【解决方案1】:

您可以结合使用SqlConnectionStringBuilder 类和命令行参数来满足要求。提供的解决方案不会将命令行输入视为 json。它期望输入是一个普通的命令行参数。我建议您再次访问并检查您的用户是否可以将 json 转换为参数列表并将其传递给应用程序

因此,假设用户使用以下参数运行应用程序:

dotnet run --ClientID XXX

Program.cs 内部,确保将命令行参数传递给CreateDefaultBuilder() 方法,因为这是在内部解析所有命令行参数并将它们添加到配置对象的方法。

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });

有了它,您现在可以覆盖 startup.cs 内的数据库值,如内联所示:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(Configuration.GetConnectionString("ImportConnection"));

if (!string.IsNullOrEmpty(Configuration.GetValue<string>("ClientID")))
{
    builder.InitialCatalog = Configuration.GetValue<string>("ClientID");
}

services.AddDbContext<ApplicationDBContext>(options => options.UseSqlServer(builder.ConnectionString));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多