.NET Core中非控制器类的构造函数注入问题求助
解决方案:.NET依赖注入在应用层的正确使用
问题根源
你直接通过new SomeApplication()创建实例时,DI容器无法自动注入它的构造参数ITxtManipulator——只有由DI容器创建的对象,才能享受自动依赖注入的能力。
具体解决步骤
1. 注册应用层类到DI容器
首先需要把SomeApplication也添加到服务集合中,让DI容器管理它的生命周期和依赖解析。修改Program.cs:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddScoped<ITxtManipulator, TxtManipulatorA>(); builder.Services.AddScoped<SomeApplication>(); // 注册应用层类到容器 builder.Services.AddControllers(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
2. 控制器中调用应用层类(无需构造注入)
如果你不想在控制器中使用构造注入,可以通过HttpContext.RequestServices从DI容器中获取SomeApplication的实例,容器会自动为它注入ITxtManipulator依赖。修改StudentController.cs:
[ApiController] [Route("api/[controller]")] public class StudentController : ControllerBase { public string Get() { var someApp = HttpContext.RequestServices.GetRequiredService<SomeApplication>(); return someApp.GetStudentDefault(); } }
更推荐的替代方案(符合关注点分离)
虽然你提到不想在控制器用依赖注入,但其实控制器构造注入SomeApplication依然符合关注点分离原则:控制器仅负责接收请求并转发给应用层,不关心应用层的内部依赖。这种方式比服务定位器更清晰,依赖关系一目了然:
[ApiController] [Route("api/[controller]")] public class StudentController : ControllerBase { private readonly SomeApplication _someApp; public StudentController(SomeApplication someApp) { _someApp = someApp; } public string Get() { return _someApp.GetStudentDefault(); } }
内容的提问来源于stack exchange,提问作者Raj Vadla
相关产品推荐
相关产品推荐

