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

类库无法访问MVC项目appsettings.json及依赖注入使用问题

问题核心原因

  1. LoadData是SqlDataAccess的实例方法,你直接用类名调用属于语法错误,必须拿到实例对象才能调用该方法。
  2. 你将ShortUrlProcessor定义为静态类,无法通过依赖注入的构造函数传参拿到容器中已经注册好的IConfigManager实例,自然无法调用对应方法。

推荐解决方案(符合依赖注入规范)

1. 调整ShortUrlProcessor的设计

去掉静态类、静态方法声明,通过构造函数注入IConfigManager依赖,同时修正SQL拼接的注入风险:

public class ShortUrlProcessor
{
    private readonly IConfigManager _configManager;
    
    // 依赖注入容器会自动传入已经注册好的IConfigManager实例
    public ShortUrlProcessor(IConfigManager configManager)
    {
        _configManager = configManager;
    }
    
    public ShortURLModel GetOriginalURL(string shortUrl)
    {        
        // 改用参数化查询避免SQL注入风险
        string sql = @"SELECT * FROM dbo.shorturl WHERE shortUrl = @ShortUrl";
        var originalURLEnum = _configManager.LoadData<ShortURLModel>(sql, new { ShortUrl = shortUrl }); 
        return originalURLEnum.FirstOrDefault();
    }
}
  • 同步调整SqlDataAccess的LoadData方法支持参数传递,适配Dapper的参数化查询:
public List<T> LoadData<T>(string sql, object parameters = null)
{
    using (IDbConnection cnn = new SqlConnection(GetConnectionString()))
    {
        return cnn.Query<T>(sql, parameters).ToList();
    }
}

2. 注册ShortUrlProcessor到DI容器

在Startup.cs的ConfigureServices方法中追加服务注册:

services.AddScoped<ShortUrlProcessor>();
// 你之前的注册代码保留
services.AddSingleton<IConfigManager, SqlDataAccess>();

3. 调用ShortUrlProcessor

比如在MVC控制器中使用时,直接通过构造函数注入即可,容器会自动完成整个依赖链的实例化:

public class UrlController : Controller
{
    private readonly ShortUrlProcessor _shortUrlProcessor;
    
    public UrlController(ShortUrlProcessor shortUrlProcessor)
    {
        _shortUrlProcessor = shortUrlProcessor;
    }
    
    public IActionResult Redirect(string shortUrl)
    {
        var originalUrlModel = _shortUrlProcessor.GetOriginalURL(shortUrl);
        if(originalUrlModel == null) return NotFound();
        return Redirect(originalUrlModel.OriginalUrl);
    }
}

不推荐的兼容方案(保留静态类)

如果你实在不想修改静态类的设计,可以在项目启动时把IConfigManager实例赋值给静态类的静态属性,代码如下:

  1. 先修改ShortUrlProcessor:
public static class ShortUrlProcessor
{
    // 全局静态存储IConfigManager实例
    public static IConfigManager ConfigManager { get; set; }
    
    public static ShortURLModel GetOriginalURL(string shortUrl)
    {        
        string sql = @"SELECT * FROM dbo.shorturl WHERE shortUrl = @ShortUrl";
        var originalURLEnum = ConfigManager.LoadData<ShortURLModel>(sql, new { ShortUrl = shortUrl }); 
        return originalURLEnum.FirstOrDefault();
    }
}
  1. 在Startup.cs的Configure方法中初始化静态属性:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IConfigManager configManager)
{
    ShortUrlProcessor.ConfigManager = configManager;
    // 原有启动逻辑保留
}

该方案违背依赖注入的控制反转原则,会提升单元测试的难度,仅做兼容参考不推荐使用。


内容的提问来源于stack exchange,提问作者CodeMuppet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:45:00