在ASP.net Core 2 MVC应用程序中从appSettings.json存储/检索ConnectionString [英] Store / Retrieve ConnectionString from appSettings.json in ASP.net Core 2 MVC app
问题描述
我正在寻找一种最佳实践方法,以将连接字符串存储在.net Core 2 MVC应用程序的appsettings.json中(就像在MVC 5中的web.config中一样)./p>
我想使用Dapper而不是EF(我发现了很多EF示例).
类似这样的东西:
{
"ConnectionStrings": {
"myDatabase": "Server=.;Database=myDatabase;Trusted_Connection=true;"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
}
网上肯定有很多例子吗?我找不到适用于.net core 2.0的东西.
在1和2之间发生了几处变化,我想确保我正在使用版本2的最佳做法.
我发现了这一点-但它似乎是.net核心1: Visual Studio 2017-MVC核心-第05部分-来自appsettings.json的连接字符串
这使用键值对appsettings-而不是连接字符串: 在ASP.NET Core 2.0中阅读AppSettings
再次不清楚这是.net Core 1还是2: Net Core Connection String Dapper视觉工作室2017
在appsettings.json
中定义您的连接字符串
{
"connectionStrings": {
"appDbConnection": "..."
}
}
在启动时读取其值
如果遵循约定并在connectionStrings
下定义连接字符串,则可以使用扩展方法GetConnectionString()
读取其值.
public class Startup
{
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
// Since you said you're using Dapper, I guess you might want to
// inject IDbConnection?
services.AddTransient<IDbConnection>((sp) =>
new SqlConnection(this.Configuration.GetConnectionString("appDbConnection"))
);
// ...
}
}
在存储库中使用IDbConnection吗?
public interface ISpecificationRepository
{
Specification GetById(int specificationId);
}
public SpecificationRepository : ISpecificationRepository
{
private readonly IDbConnection _dbConnection;
public SpecificationRepository(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}
public Specification GetById(int specificationId)
{
const string sql = @"SELECT * FROM [YOUR_TABLE]
WHERE Id = @specId;";
return _dbConnection
.QuerySingleOrDefault<Specification>(sql,
new { specId = specificationId });
}
}
是否只需要POCO中的连接字符串?
您可以使用选项模式.
-
在appsettings.json中定义与
JSON
对象结构完全匹配的类public class ConnectionStringConfig { public string AppDbConnection { get; set; } }
-
在启动时注册该配置
public void ConfigureServices(IServiceCollection services) { // ... services.Configure<ConnectionStringConfig>( this.Configuration.GetSection("connectionStrings") ); // ... }
-
在POCO中接收访问器
public class YourPoco { private readonly ConnectionStringConfig _connectionStringConfig; public YourPoco(IOptions<ConnectionStringConfig> configAccessor) { _connectionStringConfig = configAccessor.Value; // Your connection string value is here: // _connectionStringConfig.AppDbConnection; } }
注意:
I'm looking for the best practice way to store a connection string in appsettings.json in a .net Core 2 MVC app (like you do in web.config in MVC 5).
I want to use Dapper not EF (I found many EF examples).
Something like this:
{
"ConnectionStrings": {
"myDatabase": "Server=.;Database=myDatabase;Trusted_Connection=true;"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
}
Surely there are many examples online? Nothing I can find that is for .net core 2.0.
Several things have changed between 1 and 2 and I want to ensure I'm using version 2 best practices.
I've found this - but it seems to be .net core 1: Visual Studio 2017 - MVC Core - Part 05 - Connection String from appsettings.json
This uses key value pair appsettings - not the connectionstrings: Read AppSettings in ASP.NET Core 2.0
Again it's unclear if this is .net Core 1 or 2: Net Core Connection String Dapper visual studio 2017
Define your connection string(s) in appsettings.json
{
"connectionStrings": {
"appDbConnection": "..."
}
}
Read its value on Startup
If you follow the convention and define your connection string(s) under connectionStrings
, you can use the extension method GetConnectionString()
to read its value.
public class Startup
{
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
// Since you said you're using Dapper, I guess you might want to
// inject IDbConnection?
services.AddTransient<IDbConnection>((sp) =>
new SqlConnection(this.Configuration.GetConnectionString("appDbConnection"))
);
// ...
}
}
Use IDbConnection within the repository?
public interface ISpecificationRepository
{
Specification GetById(int specificationId);
}
public SpecificationRepository : ISpecificationRepository
{
private readonly IDbConnection _dbConnection;
public SpecificationRepository(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}
public Specification GetById(int specificationId)
{
const string sql = @"SELECT * FROM [YOUR_TABLE]
WHERE Id = @specId;";
return _dbConnection
.QuerySingleOrDefault<Specification>(sql,
new { specId = specificationId });
}
}
Just need the connection string in a POCO?
You might use the Options Pattern.
Define a class that exactly matches the
JSON
object structure in appsettings.jsonpublic class ConnectionStringConfig { public string AppDbConnection { get; set; } }
Register that configuration on Startup
public void ConfigureServices(IServiceCollection services) { // ... services.Configure<ConnectionStringConfig>( this.Configuration.GetSection("connectionStrings") ); // ... }
Receive the accessor in your POCO
public class YourPoco { private readonly ConnectionStringConfig _connectionStringConfig; public YourPoco(IOptions<ConnectionStringConfig> configAccessor) { _connectionStringConfig = configAccessor.Value; // Your connection string value is here: // _connectionStringConfig.AppDbConnection; } }
Notes:
- See my sample codes on how to read values from appsettings.json both on Core 1.x and 2.0.
- See how I setup if you have more than 1 connection string.
这篇关于在ASP.net Core 2 MVC应用程序中从appSettings.json存储/检索ConnectionString的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!