如何在另一个控制器中实例化依赖IConfiguration的ShippingRequestController
解决控制器实例化时的IConfiguration参数问题
首先明确:不要手动实例化控制器。ASP.NET Core依赖注入(DI)框架会负责控制器的创建和生命周期管理,手动new控制器会绕过DI机制,不仅违背设计原则,还可能导致后续依赖变更时出现维护问题。
正确的处理方式
把控制器里的业务逻辑抽成独立的服务类,避免控制器之间直接依赖:
- 创建一个服务类封装共享逻辑
public class ShippingRequestService { private readonly IConfiguration _configuration; public ShippingRequestService(IConfiguration configuration) { _configuration = configuration; } // 把原来ShippingRequestController里用到连接字符串的方法移到这里 public string GetShipRequestConnectionString() { return _configuration.GetConnectionString("ShipRequestDBString"); } }
- 在
Program.cs中注册这个服务
builder.Services.AddScoped<ShippingRequestService>();
- 在需要的控制器中注入这个服务,而不是实例化另一个控制器
public class AnotherController : Controller { private readonly ShippingRequestService _shippingService; public AnotherController(ShippingRequestService shippingService) { _shippingService = shippingService; } // 直接调用服务方法即可 public IActionResult SomeAction() { var connString = _shippingService.GetShipRequestConnectionString(); // 后续逻辑 return Ok(); } }
不推荐的临时方案(仅应急用)
如果暂时不想重构代码,可在当前控制器中注入IConfiguration,再传递给手动实例化的ShippingRequestController:
public class AnotherController : Controller { private readonly IConfiguration _configuration; public AnotherController(IConfiguration configuration) { _configuration = configuration; } public IActionResult SomeAction() { // 不推荐这种写法,仅临时使用 var mySRControl = new ShippingRequestController(_configuration); // 后续逻辑 return Ok(); } }
内容的提问来源于stack exchange,提问作者Matt R
相关产品推荐
相关产品推荐

