在 Asp.Net 核心应用程序中使用连接字符串的最佳实践
Best Practice to use connection string in Asp.Net Core app
我无法使用 EF,因为它不适用于 Oracle(或者我发现的教程已过时且无法使用)。
我打算使用 ODP.Net 或 devart 的驱动程序。
使用来自 appsettings.json 的连接字符串的最佳方法是什么?
我看过很多不完整或不适用于 Asp.Net Core 3.1
的教程
我的控制器
public class ReportController : Controller
{
private readonly ConnectionString myString;
public ReportController(IOptions<ConnectionString> connectionString)
{
myString = connectionString.Value;
}
public ActionResult Reporting_Totals()
{
string connectionString = myString.ToString();
DataTable dt = new DataTable();
using (OracleConnection oracleConnection = new OracleConnection())
return View();
}
连接字符串class
public class ConnectionString
{
private string connectionString { get; set; }
// enable set in singleton property instance to work correctly.
//public static ConnectionString Instance { get; set; } = new ConnectionString();
//public string DatabaseConnection { get; set; }
}
我的创业公司class
public Startup(IConfiguration configuration)
{
Configuration = configuration;
//configuration.GetSection("ConnectionString").Bind(ConnectionString.Instance);
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ConnectionString>(Configuration.GetSection("ConnectionStrings"));
services.AddControllersWithViews();
}
我的appsettings.json
"ConnectionStrings": {
"DEV": "Server=myServer;Database=myDb1;Trusted_Connection=True;",
"PROD": "Server=myServer;Database=myDb2;Trusted_Connection=True;"
我认为最好的方法是使用依赖注入:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ConnectionString>(Configuration.GetSection(nameof(ConnectionStrings))AddOptionsSnapshot<ConnectionStrings>();
services.AddControllersWithViews();
}
然后在控制器上:
internal ConnectionStrings ConnectionStrings
{
get
{
return this.HttpContext.RequestServices.GetRequiredService<ConnectionStrings>();
}
}
您是否有任何特殊原因需要特殊的 ConnectionString
class
?如果你只想获取连接字符串,你可以直接注入 IConfiguration
并使用 GetConnectionString
扩展方法。
public class ReportController
{
private readonly string myString;
public ReportController(IConfiguration configuration)
{
myString = configuration.GetConnectionString("DEV");
}
}
/*
appsettings.json
{
"ConnectionStrings": {
"DEV": "<Your connection string>",
"PROD": "<Your connection string>"
}
}
*/
这样做的好处是,只要您可以通过 .NET Core
的配置系统加载配置,您就可以使用此方法,而不管连接字符串存储在何处。因此,如果您决定像其他人建议的那样使用 Azure Key Vault 或 AWS,或者 appsettings.json 来存储您的连接字符串,您可以注入 IConfiguration
并使用 GetConnectionString
只要有用于存储秘密的配置提供程序。 .json 文件和 Azure Key Vault 已经存在这样的提供商,我不知道 AWS。
另一方面,您可以查看 Use multiple environments in ASP.NET Core 并针对不同的环境使用不同的配置设置。这样,您可以使用 "Reports" 或其他描述您的数据源的名称,而不是 "DEV" 和 "PROD" 作为 "ConnectionStrings" 配置中的键重新连接,并为您的给定环境使用不同的连接字符串。
例如,使用 appsettings.{Environment}.json 个文件...
public class ReportController
{
private readonly string myString;
public ReportController(IConfiguration configuration)
{
myString = configuration.GetConnectionString("Reports"); //Will give you the correct connection string based on your environment.
}
}
/*
appsettings.Production.json
{
"ConnectionStrings": {
"Reports": "<Your production connection string>",
}
}
appsettings.Development.json
{
"ConnectionStrings": {
"Reports": "<Your development connection string>"
}
}
*/
我无法使用 EF,因为它不适用于 Oracle(或者我发现的教程已过时且无法使用)。
我打算使用 ODP.Net 或 devart 的驱动程序。
使用来自 appsettings.json 的连接字符串的最佳方法是什么?
我看过很多不完整或不适用于 Asp.Net Core 3.1
的教程我的控制器
public class ReportController : Controller
{
private readonly ConnectionString myString;
public ReportController(IOptions<ConnectionString> connectionString)
{
myString = connectionString.Value;
}
public ActionResult Reporting_Totals()
{
string connectionString = myString.ToString();
DataTable dt = new DataTable();
using (OracleConnection oracleConnection = new OracleConnection())
return View();
}
连接字符串class
public class ConnectionString
{
private string connectionString { get; set; }
// enable set in singleton property instance to work correctly.
//public static ConnectionString Instance { get; set; } = new ConnectionString();
//public string DatabaseConnection { get; set; }
}
我的创业公司class
public Startup(IConfiguration configuration)
{
Configuration = configuration;
//configuration.GetSection("ConnectionString").Bind(ConnectionString.Instance);
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ConnectionString>(Configuration.GetSection("ConnectionStrings"));
services.AddControllersWithViews();
}
我的appsettings.json
"ConnectionStrings": {
"DEV": "Server=myServer;Database=myDb1;Trusted_Connection=True;",
"PROD": "Server=myServer;Database=myDb2;Trusted_Connection=True;"
我认为最好的方法是使用依赖注入:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ConnectionString>(Configuration.GetSection(nameof(ConnectionStrings))AddOptionsSnapshot<ConnectionStrings>();
services.AddControllersWithViews();
}
然后在控制器上:
internal ConnectionStrings ConnectionStrings
{
get
{
return this.HttpContext.RequestServices.GetRequiredService<ConnectionStrings>();
}
}
您是否有任何特殊原因需要特殊的 ConnectionString
class
?如果你只想获取连接字符串,你可以直接注入 IConfiguration
并使用 GetConnectionString
扩展方法。
public class ReportController
{
private readonly string myString;
public ReportController(IConfiguration configuration)
{
myString = configuration.GetConnectionString("DEV");
}
}
/*
appsettings.json
{
"ConnectionStrings": {
"DEV": "<Your connection string>",
"PROD": "<Your connection string>"
}
}
*/
这样做的好处是,只要您可以通过 .NET Core
的配置系统加载配置,您就可以使用此方法,而不管连接字符串存储在何处。因此,如果您决定像其他人建议的那样使用 Azure Key Vault 或 AWS,或者 appsettings.json 来存储您的连接字符串,您可以注入 IConfiguration
并使用 GetConnectionString
只要有用于存储秘密的配置提供程序。 .json 文件和 Azure Key Vault 已经存在这样的提供商,我不知道 AWS。
另一方面,您可以查看 Use multiple environments in ASP.NET Core 并针对不同的环境使用不同的配置设置。这样,您可以使用 "Reports" 或其他描述您的数据源的名称,而不是 "DEV" 和 "PROD" 作为 "ConnectionStrings" 配置中的键重新连接,并为您的给定环境使用不同的连接字符串。
例如,使用 appsettings.{Environment}.json 个文件...
public class ReportController
{
private readonly string myString;
public ReportController(IConfiguration configuration)
{
myString = configuration.GetConnectionString("Reports"); //Will give you the correct connection string based on your environment.
}
}
/*
appsettings.Production.json
{
"ConnectionStrings": {
"Reports": "<Your production connection string>",
}
}
appsettings.Development.json
{
"ConnectionStrings": {
"Reports": "<Your development connection string>"
}
}
*/