代码之家  ›  专栏  ›  技术社区  ›  niico

从ASP.NET Core 2 MVC应用程序中的appsettings.json存储/检索connectionString

  •  7
  • niico  · 技术社区  · 8 年前

    我在找 最佳实践 在.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"
        }
      }
    }
    

    当然网上有很多例子吗?我找不到任何适合.NET核心2.0的内容。

    在1和2之间发生了一些变化,我希望确保使用的是版本2最佳实践。

    我发现了这个-但它似乎是.NET核心1: Visual Studio 2017 - MVC Core - Part 05 - Connection String from appsettings.json

    这将使用键值对appsettings-而不是connectionStrings: Read AppSettings in ASP.NET Core 2.0

    同样,不清楚这是.NET核心1还是2: Net Core Connection String Dapper visual studio 2017

    2 回复  |  直到 8 年前
        1
  •  9
  •   David Liang    8 年前

    在中定义连接字符串 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. 定义一个与 JSON appsettings.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. 见 my sample codes 关于如何从核心1.x和2.0上的appsettings.json读取值。
    2. 见 how I setup 如果有多个连接字符串。
        2
  •  2
  •   Kirk Larkin    8 年前

    只需在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");
        }
    }
    
    推荐文章