.NET Core 2.0 Web API:如何从表示层向DAL传递数据库连接字符串
解决.NET Core 2.0多层架构中DAL获取连接字符串的方案
首先得明确:咱们的分层架构是Presentation→BLL→DAL,绝对不能让DAL直接去读表示层的配置文件——这会破坏分层的独立性和依赖方向。下面给你几个符合.NET Core设计原则的靠谱方案:
方案一:构造函数注入连接字符串(推荐,最简洁)
这是.NET Core依赖注入的标准玩法,完全贴合架构依赖关系:
在表示层(Web API)的Startup.cs里注册配置
.NET Core默认会自动加载appsettings.json,你只需要在ConfigureServices里把连接字符串提取出来,注册到DI容器,或者直接传给DAL的服务:public void ConfigureServices(IServiceCollection services) { // 从appsettings.json读取连接字符串 var dbConnString = Configuration.GetConnectionString("YourDatabase"); // 注册DAL的服务,把连接字符串通过构造函数注入 services.AddScoped<IDataAccessLayer>(sp => new DataAccessLayer(dbConnString)); // 注册BLL服务(BLL只依赖DAL的接口,不用管配置细节) services.AddScoped<IBusinessLogicLayer, BusinessLogicLayer>(); services.AddMvc(); }记得在
appsettings.json里补充连接字符串节点:{ "ConnectionStrings": { "YourDatabase": "Server=.;Database=YourDbName;Trusted_Connection=True;" }, "Logging": { // 原有的日志配置内容 } }DAL层通过构造函数接收连接字符串
让你的DAL类暴露构造函数,接收连接字符串参数:public class DataAccessLayer : IDataAccessLayer { private readonly string _dbConnString; // 构造函数注入连接字符串 public DataAccessLayer(string dbConnString) { _dbConnString = dbConnString ?? throw new ArgumentNullException(nameof(dbConnString)); } public async Task<List<YourEntity>> GetDataAsync() { using(var conn = new SqlConnection(_dbConnString)) { // 执行数据库查询逻辑 // ... } } }BLL层只依赖DAL接口
BLL完全不用关心连接字符串的来源,只需要依赖DAL的接口即可,完美符合依赖倒置原则:public class BusinessLogicLayer : IBusinessLogicLayer { private readonly IDataAccessLayer _dal; public BusinessLogicLayer(IDataAccessLayer dal) { _dal = dal ?? throw new ArgumentNullException(nameof(dal)); } public async Task<List<YourEntity>> ProcessDataAsync() { var rawData = await _dal.GetDataAsync(); // 业务逻辑处理 return rawData; } }
方案二:用配置类传递(适合多配置项场景)
如果DAL除了连接字符串还需要其他配置(比如数据库超时时间、重试次数),可以创建一个专门的配置类:
在共享类库或DAL层定义配置类
public class DalConfiguration { public string DbConnectionString { get; set; } public int DbCommandTimeout { get; set; } = 30; }表示层绑定配置并注册到DI
在Startup.cs里把appsettings.json的配置绑定到这个类,再注册为单例:public void ConfigureServices(IServiceCollection services) { var dalConfig = new DalConfiguration(); Configuration.Bind("DalConfiguration", dalConfig); services.AddSingleton(dalConfig); // 注册DAL和BLL服务 services.AddScoped<IDataAccessLayer, DataAccessLayer>(); services.AddScoped<IBusinessLogicLayer, BusinessLogicLayer>(); services.AddMvc(); }对应的
appsettings.json添加:{ "DalConfiguration": { "DbConnectionString": "Server=.;Database=YourDbName;Trusted_Connection=True;", "DbCommandTimeout": 60 }, // 其他配置 }DAL接收配置类
修改DAL的构造函数来接收整个配置对象:public class DataAccessLayer : IDataAccessLayer { private readonly DalConfiguration _config; public DataAccessLayer(DalConfiguration config) { _config = config ?? throw new ArgumentNullException(nameof(config)); } public async Task<List<YourEntity>> GetDataAsync() { using(var conn = new SqlConnection(_config.DbConnectionString)) { conn.CommandTimeout = _config.DbCommandTimeout; // 执行查询 } } }
千万别这么做!
绝对不要让DAL直接读取表示层的appsettings.json,比如在DAL里写:
var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); var connString = config.GetConnectionString("YourDatabase");
这种写法会让DAL直接依赖表示层的文件路径,破坏分层架构,测试和部署时很容易踩坑(比如文件找不到、路径错误)。
内容的提问来源于stack exchange,提问作者Alvin
相关产品推荐
相关产品推荐

