含传统类库与.NET Core 2 MVC的解决方案中web.config连接字符串失效
解决.NET Core 2 MVC中数据访问层读取连接字符串的问题
这个问题的核心是你在.NET Core项目中沿用了.NET Framework时代的ConfigurationManager配置读取方式,而.NET Core有一套全新的配置系统,和老机制不兼容,同时类库也需要适配新的配置方式。下面是具体的解决步骤:
1. 放弃ConfigurationManager,改用.NET Core配置系统
首先,你需要移除数据访问层中对System.Configuration.ConfigurationManager的依赖,这是.NET Framework专属的API,在.NET Core中不仅适配性差,还违背了.NET Core的配置设计理念。
2. 给数据访问层类库安装必要的NuGet包
在数据访问层类库的NuGet包管理器中安装以下包:
Microsoft.Extensions.Configuration:提供.NET Core配置系统的核心抽象Microsoft.Extensions.Configuration.Json:用于读取JSON格式的配置文件
3. 调整数据访问层获取连接字符串的代码
推荐使用依赖注入的方式来获取配置,这是.NET Core的最佳实践,既灵活又便于测试和维护:
方式一:依赖注入IConfiguration
修改你的数据访问类,通过构造函数注入IConfiguration:
using Microsoft.Extensions.Configuration; public class YourDataAccessClass { private readonly string _connectionString; // 通过构造函数注入配置对象 public YourDataAccessClass(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConn"); } // 后续使用_connectionString执行数据库操作 }
然后在MVC项目的Startup.cs的ConfigureServices方法中注册你的数据访问类:
services.AddScoped<YourDataAccessClass>();
.NET Core会自动将主项目加载的所有配置(包括appsettings.json)注入到类中。
方式二:手动构建配置对象(仅用于特殊场景)
如果不想用依赖注入,也可以手动构建配置对象读取appsettings.json,但要注意类库的运行目录是主MVC项目的输出目录:
using Microsoft.Extensions.Configuration; using System.IO; public class YourDataAccessClass { private readonly string _connectionString; public YourDataAccessClass() { var configBuilder = new ConfigurationBuilder() // 设置基目录为主项目的输出目录 .SetBasePath(Directory.GetCurrentDirectory()) // 加载appsettings.json,设置为必填且支持热重载 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfiguration config = configBuilder.Build(); _connectionString = config.GetConnectionString("DefaultConn"); } }
4. 确保appsettings.json的复制属性正确设置
右键MVC项目中的appsettings.json文件,选择「属性」,将复制到输出目录设置为如果较新则复制或始终复制,避免运行时找不到配置文件。
为什么之前的尝试无效?
- 用
web.config的方式:.NET Core中web.config主要用于IIS相关配置,不再是应用配置的主要载体,ConfigurationManager无法正确解析.NET Core项目的web.config结构。 - 直接用
appsettings.json但无效:数据访问层类库不会自动加载主项目的配置文件,必须通过依赖注入或手动构建配置对象的方式主动读取。
内容的提问来源于stack exchange,提问作者niico
相关产品推荐
相关产品推荐

