在 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 中的方法(就像您在 web.config 在 MVC 5).

我想使用 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 core 1: Visual Studio 2017 - MVC Core - Part 05 - Connection String from appsettings.json

这使用键值对应用程序设置 - 而不是连接字符串: Read AppSettings in ASP.NET Core 2.0

同样不清楚这是 .net Core 1 还是 2:

在appsettings.json.

中如下所示
"ConnectionStrings": {
    "DefaultConnection": "Data Source=;Initial Catalog=;Persist Security Info=True;User ID=; Password=;"
}

在 Startup.cs 中获取它,如下所述:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }
}

使用依赖注入在控制器中注入配置,如下所述:

public class MyController : Controller
{
    private readonly IConfiguration _configuration;
    private string connectionString;

    public MyController(IConfiguration configuration) 
    {
        _configuration = configuration;

        connectionString = _configuration.GetConnectionString("DefaultConnection");
    }
}

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 中的连接字符串?

您可能会使用 Options Pattern

  1. 定义一个class与appsettings.json

    中的JSON对象结构完全匹配
    public class ConnectionStringConfig
    {
        public string AppDbConnection { get; set; }
    }
    
  2. 在启动时注册该配置

    public void ConfigureServices(IServiceCollection services)
    {
       // ...
    
       services.Configure<ConnectionStringConfig>(
           this.Configuration.GetSection("connectionStrings")
       );
    
       // ...
    }
    
  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;
        }
    }
    

备注:

  1. 请参阅 ,了解如何在 Core 1.x 和 2.0 上从 appsettings.json 读取值。
  2. 如果您有超过 1 个连接字符串,请参阅 how I setup