在ASP.net Core 2 MVC应用程序中从appSettings.json存储/检索ConnectionString [英] Store / Retrieve ConnectionString from appSettings.json in ASP.net Core 2 MVC app

查看:236
本文介绍了在ASP.net Core 2 MVC应用程序中从appSettings.json存储/检索ConnectionString的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一种最佳实践方法,以将连接字符串存储在.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中的连接字符串?

您可以使用选项模式.

  1. 在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读取值的信息,请参见我的示例代码./li>
  2. 如果您有多个连接字符串,请参见如何设置.

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.

  1. Define a class that exactly matches the JSON object structure in appsettings.json

    public class ConnectionStringConfig
    {
        public string AppDbConnection { get; set; }
    }
    

  2. Register that configuration on Startup

    public void ConfigureServices(IServiceCollection services)
    {
       // ...
    
       services.Configure<ConnectionStringConfig>(
           this.Configuration.GetSection("connectionStrings")
       );
    
       // ...
    }
    

  3. 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:

  1. See my sample codes on how to read values from appsettings.json both on Core 1.x and 2.0.
  2. See how I setup if you have more than 1 connection string.

这篇关于在ASP.net Core 2 MVC应用程序中从appSettings.json存储/检索ConnectionString的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆