通过迁移我开发的当前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"如果唯一的属性都是连接字符串?
答案 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对象中。您可以在每个查询中使用它们,甚至在每次调用时都按索引选择它。