You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 2.0 Web API:如何从表示层向DAL传递数据库连接字符串

解决.NET Core 2.0多层架构中DAL获取连接字符串的方案

首先得明确:咱们的分层架构是Presentation→BLL→DAL,绝对不能让DAL直接去读表示层的配置文件——这会破坏分层的独立性和依赖方向。下面给你几个符合.NET Core设计原则的靠谱方案:

方案一:构造函数注入连接字符串(推荐,最简洁)

这是.NET Core依赖注入的标准玩法,完全贴合架构依赖关系:

  1. 在表示层(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": {
        // 原有的日志配置内容
      }
    }
    
  2. 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))
            {
                // 执行数据库查询逻辑
                // ...
            }
        }
    }
    
  3. 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除了连接字符串还需要其他配置(比如数据库超时时间、重试次数),可以创建一个专门的配置类:

  1. 在共享类库或DAL层定义配置类

    public class DalConfiguration
    {
        public string DbConnectionString { get; set; }
        public int DbCommandTimeout { get; set; } = 30;
    }
    
  2. 表示层绑定配置并注册到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
      },
      // 其他配置
    }
    
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:05:00