.NET Core 从 appsettings.json 获取连接字符串
.NET Core get connection string from appsettings.json
我开发了一个简单的 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);
}
}
启动class:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationContext>();
services.AddMvc();
}
如何从 appsettings.json
提取连接字符串到 ApplicationContext
class?
我不想为 ApplicationContext
class 创建任何构造函数。
假设您有 .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)
{ }
...
}
您可以使用工厂模式来解析您的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...
}
}
So I want to write the connection string straight into OnConfiguring method:
How can I extract connection string from appsettings.json into ApplicationContext class?
I wouldn't like to create any constructors for ApplicationContext class.
您可以通过 IOptions
使用 选项模式 ,但最简单的方法是在 ApplicationContext
构造函数中使用 DI ;)
请关注以下文章:
.NET 核心 2.0
添加这个 class:
// 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.json" 文件中获取键 "MssqlConnectionString" 的值:
var appSettingsJson = AppSettingsJson.GetAppSettings();
var connectionString = appSettingsJson["MssqlConnectionString"];
在项目的根目录中创建文件"appsettings.json":
{
"MssqlConnectionString": "Server=yourip; Database=yourdbname; User Id=yourusername; Password=yourpassword; Pooling=true;",
"Db2ConnectionString": "Database=yourdbname;UserID=yourusername;Password=yourpassword;Server=yourip:yourport",
"SomeOtherKey": "SomeOtherValue"
}
我开发了一个简单的 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);
}
}
启动class:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationContext>();
services.AddMvc();
}
如何从 appsettings.json
提取连接字符串到 ApplicationContext
class?
我不想为 ApplicationContext
class 创建任何构造函数。
假设您有 .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)
{ }
...
}
您可以使用工厂模式来解析您的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...
}
}
So I want to write the connection string straight into OnConfiguring method:
How can I extract connection string from appsettings.json into ApplicationContext class?
I wouldn't like to create any constructors for ApplicationContext class.
您可以通过 IOptions
使用 选项模式 ,但最简单的方法是在 ApplicationContext
构造函数中使用 DI ;)
请关注以下文章:
.NET 核心 2.0
添加这个 class:
// 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.json" 文件中获取键 "MssqlConnectionString" 的值:
var appSettingsJson = AppSettingsJson.GetAppSettings();
var connectionString = appSettingsJson["MssqlConnectionString"];
在项目的根目录中创建文件"appsettings.json":
{
"MssqlConnectionString": "Server=yourip; Database=yourdbname; User Id=yourusername; Password=yourpassword; Pooling=true;",
"Db2ConnectionString": "Database=yourdbname;UserID=yourusername;Password=yourpassword;Server=yourip:yourport",
"SomeOtherKey": "SomeOtherValue"
}