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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:16:07