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

时间:2016-05-17 22:46:43

标签: asp.net-mvc asp.net-core asp.net-core-mvc dapper

通过迁移我开发的当前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;"
        }
    }

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

3 个答案:

答案 0 :(得分:3)

我对Adem对RC2工作的回应做了一些修正,所以我想我最好发布它们。

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

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

    public string CustomConnectionString { get; set; }
}

services.Configure<Models.ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));

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

private readonly ConnectionStrings _connectionStrings;
        public HomeController(IOptions<ConnectionStrings> connectionStrings)
        {
            _connectionStrings = connectionStrings.Value;
        }

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

从任何Controller或Action方法中获取

所以这是控制器,

DAL.DataMethods dm = new DAL.DataMethods(_connectionStrings.CustomConnectionString);

然后在实例化DAL时传递相应的connectionString

{{1}}

所有的例子都显示了这一点,他们只是没有陈述,为什么我试图直接从DAL拉出来不起作用

答案 1 :(得分:0)

您可以使用Options访问DAL图层。我将尝试编写简单的例子(RC1):

首先,您需要使用以下内容创建appsettings.json文件:

{
    "ConnectionStrings": {
      "DefaultConnectionString": "Default",
      "CustomConnectionString": "Custom"
    }
}

然后创建一个类:

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

    public string CustomConnectionString { get; set; }
}

并在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"));
    }

最后将其注入DAL类:

    private IOptions<ConnectionStrings> _connectionStrings;
    public DalClass(IOptions<ConnectionStrings> connectionStrings)
    {
        _connectionStrings = connectionStrings;
    }
    //use it

答案 2 :(得分:0)

我不喜欢实例化DAL的想法。相反,我会做这样的事情

public class ConnectionStrings : Dictionary<string, string> { }

在DAL的核心中这样的东西

public Dal(IOptionsMonitor<ConnectionStrings> optionsAccessor, ILogger<Dal> logger)
{
      _connections = optionsAccessor.CurrentValue;
      _logger = logger;
}

现在,所有连接字符串都在DAL对象中。您可以在每个查询中使用它们,甚至在每次调用时都按索引选择它。