如何从 asp.net 5 中的数据访问层读取连接字符串
How to read connection string from data access layer in asp.net 5
随着新的 ASP.NET 5 取消了 web.config,并因此取消了 ConfigurationManagement 命名空间,我试图找出如何从我的 MVC 中的数据访问层项目读取连接字符串申请。
研究这个问题,我发现的所有内容都说只需从 Startup.cs 文件中的 project.json 配置文件中读取配置值,如下所示:
var configuration = new Configuration();
configuration.AddJsonFile("config.json");
configuration.AddEnvironmentVariables();
//////
var connString = configuration.Get("Data:DefaultConnection:ConnectionString");
但我不希望我的 Web 项目与数据访问有任何关系。那么,我的数据访问层项目如何在此设置中检索连接字符串?
更新: 这是我的 startup.cs 文件和 ConfigureServices 方法:
public void ConfigureServices(IServiceCollection services)
{
// Add Identity services to the services container.
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Add MVC services to the services container.
services.AddMvc();
// Register application services.
services.Configure<ApplicationOptions>(options =>
{
options.ConnectionString = "Data:DefaultConnection:ConnectionString";
});
}
这是我的 DataAccessLayer 项目,还有我的 RepoBase.cs class
public class RepoBase
{
//private readonly string _connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
//private readonly string _connectionString = Environment.GetEnvironmentVariable("ConnectionString");
private readonly string _connectionString;
public RepoBase(IOptions<ApplicationOptions> appOptions)
{
this._connectionString = appOptions.ConnectionString;
// or just read directly from System.Configuration.Get("");
}
protected SqlConnection GetConnection()
{
var conn = new SqlConnection(_connectionString);
conn.OpenAsync();
return conn;
}
}
关于如何在我的 DAL 项目中检索我的 ApplicationOptions 对象,或者只是读取在 Startup.cs
configuration.AddEnvironmentVariables()
方法调用。
更新 2: 哦,这是我需要从我的数据访问层使用来访问环境变量吗:https://github.com/aspnet/configuration/blob/master/src/Microsoft.Extensions.Configuration.EnvironmentVariables/EnvironmentVariablesConfigurationProvider.cs
这是
的副本
在您的 ConfigureServices 方法中将您的配置对象添加为单例。
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton(_ => configuration);
}
然后像这样更新您的 BaseRepo class
public class BaseRepo {
private readonly IConfigurationRoot config;
public BaseRepo(IConfigurationRoot config) {
this.config = config;
}
public static SqlConnection GetOpenConnection() {
var cs = config.Get<string>("Data:DefaultConnection:ConnectionString");
var connection = new SqlConnection(cs);
connection.Open();
return connection;
}
}
//此方法用于return连接字符串
protected string OnConfiguring()
{
var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).
AddJsonFile("appsettings.json", optional: true,
reloadOnChange: true);
appsettings.json file
string dbConnection = builder.Build().GetSection("ConnectionStrings").GetSection("DevConnections").Value;
return dbConnection;
}
//inside this mehtod connection string is used
public DataTable GetDataTable(string cmdText)
{
DataTable dt = new DataTable();
var constr = OnConfiguring(); //this method is called to get connection string
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmdText, con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(dt);
}
return dt;
}
}
}
随着新的 ASP.NET 5 取消了 web.config,并因此取消了 ConfigurationManagement 命名空间,我试图找出如何从我的 MVC 中的数据访问层项目读取连接字符串申请。
研究这个问题,我发现的所有内容都说只需从 Startup.cs 文件中的 project.json 配置文件中读取配置值,如下所示:
var configuration = new Configuration();
configuration.AddJsonFile("config.json");
configuration.AddEnvironmentVariables();
//////
var connString = configuration.Get("Data:DefaultConnection:ConnectionString");
但我不希望我的 Web 项目与数据访问有任何关系。那么,我的数据访问层项目如何在此设置中检索连接字符串?
更新: 这是我的 startup.cs 文件和 ConfigureServices 方法:
public void ConfigureServices(IServiceCollection services)
{
// Add Identity services to the services container.
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Add MVC services to the services container.
services.AddMvc();
// Register application services.
services.Configure<ApplicationOptions>(options =>
{
options.ConnectionString = "Data:DefaultConnection:ConnectionString";
});
}
这是我的 DataAccessLayer 项目,还有我的 RepoBase.cs class
public class RepoBase
{
//private readonly string _connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
//private readonly string _connectionString = Environment.GetEnvironmentVariable("ConnectionString");
private readonly string _connectionString;
public RepoBase(IOptions<ApplicationOptions> appOptions)
{
this._connectionString = appOptions.ConnectionString;
// or just read directly from System.Configuration.Get("");
}
protected SqlConnection GetConnection()
{
var conn = new SqlConnection(_connectionString);
conn.OpenAsync();
return conn;
}
}
关于如何在我的 DAL 项目中检索我的 ApplicationOptions 对象,或者只是读取在 Startup.cs
configuration.AddEnvironmentVariables()
方法调用。
更新 2: 哦,这是我需要从我的数据访问层使用来访问环境变量吗:https://github.com/aspnet/configuration/blob/master/src/Microsoft.Extensions.Configuration.EnvironmentVariables/EnvironmentVariablesConfigurationProvider.cs
这是
在您的 ConfigureServices 方法中将您的配置对象添加为单例。
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton(_ => configuration);
}
然后像这样更新您的 BaseRepo class
public class BaseRepo {
private readonly IConfigurationRoot config;
public BaseRepo(IConfigurationRoot config) {
this.config = config;
}
public static SqlConnection GetOpenConnection() {
var cs = config.Get<string>("Data:DefaultConnection:ConnectionString");
var connection = new SqlConnection(cs);
connection.Open();
return connection;
}
}
//此方法用于return连接字符串
protected string OnConfiguring()
{
var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).
AddJsonFile("appsettings.json", optional: true,
reloadOnChange: true);
appsettings.json file
string dbConnection = builder.Build().GetSection("ConnectionStrings").GetSection("DevConnections").Value;
return dbConnection;
}
//inside this mehtod connection string is used
public DataTable GetDataTable(string cmdText)
{
DataTable dt = new DataTable();
var constr = OnConfiguring(); //this method is called to get connection string
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmdText, con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(dt);
}
return dt;
}
}
}