在没有EF的appsettings.json中获取多个连接字符串

Cou*_*uch 7 asp.net-mvc dapper asp.net-core-mvc asp.net-core

通过迁移我开发的当前MVC .Net应用程序,开始玩.Net Core RC2.它看起来像我,因为使用appsettings.json处理配置的方式,如果我有多个连接字符串,我要么必须使用EF来检索连接字符串,要么我必须为每个连接字符串创建单独的类.我看到的所有示例都使用EF(这对我来说没有意义,因为我将使用Dapper)或者该示例构建一个以config中的部分命名的类.我错过了更好的解决方案吗?

    "Data": {
        "Server1": {
          "ConnectionString": "data source={server1};initial catalog=master;integrated security=True;"
        },
        "Server2": {
          "ConnectionString": "data source={server2};initial catalog=master;integrated security=True;"
        }
    }
Run Code Online (Sandbox Code Playgroud)

为什么我要构建两个类,一个名为"Server1",另一个名为"Server2",如果唯一的属性是连接字符串?

Cou*_*uch 5

我对 Adem 对使用 RC2 的回应做了一些更正,所以我想我最好把它们贴出来。

我配置了 appsettings.json 并创建了一个类似 Adem 的类

{
    "ConnectionStrings": {
      "DefaultConnectionString": "Default",
      "CustomConnectionString": "Custom"
    }
}
Run Code Online (Sandbox Code Playgroud)

public class ConnectionStrings
{
    public string DefaultConnectionString { get; set; }

    public string CustomConnectionString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Adem 的大部分代码在 VS for RC2 中都是开箱即用的,所以我只是将下面的行添加到 ConfigureServices 方法中

services.Configure<Models.ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
Run Code Online (Sandbox Code Playgroud)

主要的缺失点是必须将连接字符串传递给控制器(一旦您指定了强类型配置对象并将其添加到服务集合中,您就可以通过请求实例从任何控制器或操作方法中请求它IOptions,https ://docs.asp.net/en/latest/mvc/controllers/dependency-injection.html )

所以这转到控制器,

private readonly ConnectionStrings _connectionStrings;
        public HomeController(IOptions<ConnectionStrings> connectionStrings)
        {
            _connectionStrings = connectionStrings.Value;
        }
Run Code Online (Sandbox Code Playgroud)

然后在实例化 DAL 时传递适当的 connectionString

DAL.DataMethods dm = new DAL.DataMethods(_connectionStrings.CustomConnectionString);
Run Code Online (Sandbox Code Playgroud)

所有的例子都表明了这一点,他们只是没有说明,为什么我直接从 DAL 中提取的尝试没有奏效


ade*_*lin 0

您可以使用层Options内访问DAL。我会尝试写一个简单的例子(RC1):

首先,您需要创建包含以下内容的 appsettings.json 文件:

{
    "ConnectionStrings": {
      "DefaultConnectionString": "Default",
      "CustomConnectionString": "Custom"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个类:

public class ConnectionStrings
{
    public string DefaultConnectionString { get; set; }

    public string CustomConnectionString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并且在Startup.cs

    private IConfiguration Configuration;
    public Startup(IApplicationEnvironment app)
    {
        var builder = new ConfigurationBuilder()
           .SetBasePath(app.ApplicationBasePath)
           .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
    }
    public void ConfigureServices(IServiceCollection services)
    {
        // ....
        services.AddOptions();
        services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
    }
Run Code Online (Sandbox Code Playgroud)

最后将其注入到DAL类中:

    private IOptions<ConnectionStrings> _connectionStrings;
    public DalClass(IOptions<ConnectionStrings> connectionStrings)
    {
        _connectionStrings = connectionStrings;
    }
    //use it
Run Code Online (Sandbox Code Playgroud)