在ASP.net Core 2 MVC应用程序中从appSettings.json存储/检索ConnectionString

nii*_*ico 8 asp.net-core asp.net-core-2.0 asp.net-core-mvc-2.0

我正在寻找在.net Core 2 MVC应用程序中的appsettings.json中存储连接字符串的最佳实践方法(就像你在MVC 5中的web.config中所做的那样).

我想使用Dapper而不是EF(我发现了许多EF示例).

像这样的东西:

{
  "ConnectionStrings": {
    "myDatabase": "Server=.;Database=myDatabase;Trusted_Connection=true;"
  },

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当然网上有很多例子吗?我无法找到.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 visual studio 2017

Dav*_*ang 12

在中定义您的连接字符串 appsettings.json

{
    "connectionStrings": {
        "appDbConnection: : "..."
    }
}
Run Code Online (Sandbox Code Playgroud)

在Startup上读取它的值

如果遵循约定并在下面定义连接字符串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"))
        );

        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在存储库中使用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 });
    }
}
Run Code Online (Sandbox Code Playgroud)

只需要POCO中的连接字符串?

您可以使用选项模式.

  1. 定义一个与JSONappsettings.json 中的对象结构完全匹配的类

    public class ConnectionStringConfig
    {
        public string AppDbConnection { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在Startup上注册该配置

    public void ConfigureServices(IServiceCollection services)
    {
       // ...
    
       services.Configure<ConnectionStringConfig>(
           this.Configuration.GetSection("connectionStrings")
       );
    
       // ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在POCO中接收访问者

    public class YourPoco
    {
        private readonly ConnectionStringConfig _connectionStringConfig;
    
        public YourPoco(IOptions<ConnectionStringConfig> configAccessor)
        {
            _connectionStringConfig = configAccessor.Value;
    
            // Your connection string value is here:
            // _connectionStringConfig.AppDbConnection;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 请参阅我的示例代码,了解如何在Core 1.x和2.0上从appsettings.json读取值.
  2. 如果您有多个连接字符串,请查看我如何设置.