. net Core从appsettings.json中获取连接字符串

本文关键字:获取 连接 字符串 json Core appsettings net | 更新日期: 2023-09-27 18:14:50

我开发了一个简单的web应用程序,在未来,我想把它作为多租户。

所以我想把连接字符串直接写入OnConfiguring方法:

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("connection string from appsettings.json");
        base.OnConfiguring(optionsBuilder);
    }
}
启动类:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationContext>();
    services.AddMvc();
}

如何从appsettings.json提取连接字符串到ApplicationContext类?

我不想为ApplicationContext类创建任何构造函数

. net Core从appsettings.json中获取连接字符串

假设您有。. NET Core应用程序和您的appsettings.json文件看起来像这样:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "Production": {
    "SqliteConnectionString": "Filename=./MyDatabase.sqlite"
  }
}

你可以像这样从Startup.cs得到SqliteConnectionString的值:

public void ConfigureServices(IServiceCollection services)
{
    var connection = Configuration["Production:SqliteConnectionString"];
    services.AddDbContext<MyContext>(options =>
        options.UseSqlite(connection)
    );
    ....
 }

然后在你的DBContext中你应该添加接受DbContextOptions的构造函数:

public class MyContext : DbContext
{
    public MyContext (DbContextOptions<MyContext> options) : base(options)
    { }
    ...
}

。Core 2.0

添加这个类:

// Requires NuGet package Microsoft.Extensions.Configuration.Json
using Microsoft.Extensions.Configuration;
using System.IO;
namespace RutarBackgroundServices.AppsettingsJson
{
    public static class AppSettingsJson
    {
        public static string ApplicationExeDirectory()
        {
            var location = System.Reflection.Assembly.GetExecutingAssembly().Location;
            var appRoot = Path.GetDirectoryName(location);
            return appRoot;
        }
        public static IConfigurationRoot GetAppSettings()
        {
            string applicationExeDirectory = ApplicationExeDirectory();
            var builder = new ConfigurationBuilder()
            .SetBasePath(applicationExeDirectory)
            .AddJsonFile("appsettings.json");
            return builder.Build();
        }

    }
}

从"appsettings"中获取键"MssqlConnectionString"的值。json文件:

var appSettingsJson = AppSettingsJson.GetAppSettings();
var connectionString = appSettingsJson["MssqlConnectionString"];

创建"appsettings"文件。

{
  "MssqlConnectionString": "Server=yourip; Database=yourdbname; User Id=yourusername; Password=yourpassword; Pooling=true;",
  "Db2ConnectionString": "Database=yourdbname;UserID=yourusername;Password=yourpassword;Server=yourip:yourport",
  "SomeOtherKey": "SomeOtherValue"
}

所以我想把连接字符串直接写入onconfiguration方法:

如何从应用设置中提取连接字符串?json到ApplicationContext类?

我不想为ApplicationContext类创建任何构造函数。

你可以通过IOptions使用选项模式,但最简单的方法是在ApplicationContext构造器中使用DI;)

请关注以下文章:

  • 使用IOptions的例子,
  • 使用选项和配置对象,
  • IOptions接口,

您可以使用工厂模式来解析DbContext

public interface ITenantDbContextFactory
{
    ApplicationContext Create(string tenantId);
}
public class TenantDbContextFactory()
{
    private ApplicationContext context;
    public TenantDbContextFactory()
    {
    }
    public ApplicationContext Create(string tenantId) 
    {
        if(this.context==null) 
        {
            var connectionString = GetConnectionForTenant(tenantId);
            var dbContextBuilder = new DbContextOptionsBuilder();
            dbContextBuilder.UseSqlServer(connectionString);
            this.context = new ApplicationContext(dbContextBuilder);
        }
        return this.context;
    }
}
在启动

:

services.AddDbContext<ApplicationContext>();
services.AddScoped<ITenantDbContextFactory, TenantDbContextFactory>();

您的服务或控制器:

public class HomeController 
{
    private readonly ITenantDbContextFactory dbFactory;
    public HomeControler(ITenantDbContextFactory tenantDbContextFactory)
    {
        this.dbFactory = tenantDbContextFactory;
    }
    public void Action()
    {
        var dbContext = this.dbFactory.Create("tenantA");
        // use your context here
        dbContext...
    }
}