类库无法访问MVC项目appsettings.json及依赖注入使用问题
问题核心原因
LoadData是SqlDataAccess的实例方法,你直接用类名调用属于语法错误,必须拿到实例对象才能调用该方法。- 你将
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实例赋值给静态类的静态属性,代码如下:
- 先修改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(); } }
- 在Startup.cs的Configure方法中初始化静态属性:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IConfigManager configManager) { ShortUrlProcessor.ConfigManager = configManager; // 原有启动逻辑保留 }
该方案违背依赖注入的控制反转原则,会提升单元测试的难度,仅做兼容参考不推荐使用。
内容的提问来源于stack exchange,提问作者CodeMuppet
相关产品推荐
相关产品推荐

