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

.NET 6中如何将请求类类型传入依赖注入类?

问题:获取服务请求者的类型注入到服务实例中

我想实现这样的逻辑:在注册IMyService时,不是传入IServiceProvider的类型(当前代码里x.GetType()返回的是ServiceProviderEngineScope),而是要获取请求该服务的类的类型(比如HomeController),并把这个类型传给MyService的实例。

原有代码

builder.Services.AddScoped<IMyService>((IServiceProvider x) => new MyService(x.GetType()));

场景说明

HomeController通过构造函数注入IMyService,希望把HomeController的类型传入MyService实例:

public class HomeController
{
    private readonly IMyService MyService;

    public HomeController(IMyService myService) 
    {
         MyService = myService;
    }
}

MyService的定义:

public class MyService : IMyService
{
    public MyService(Type requestingType)
    {
        Console.WriteLine($"This service was requested by {requestingType.Name}.");
    }
}

解决方案

针对ASP.NET Core MVC控制器的场景,可以通过IHttpContextAccessor获取当前请求对应的控制器类型,步骤如下:

  1. 先注册IHttpContextAccessor服务:
builder.Services.AddHttpContextAccessor();
  1. 修改IMyService的注册逻辑,从HttpContext中解析控制器类型:
builder.Services.AddScoped<IMyService>(serviceProvider =>
{
    var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>();
    var httpContext = httpContextAccessor.HttpContext;
    
    // 尝试获取当前请求的控制器描述符
    var controllerActionDescriptor = httpContext?.Features.Get<Microsoft.AspNetCore.Mvc.Abstractions.ControllerActionDescriptor>();
    Type requestingType = controllerActionDescriptor?.ControllerTypeInfo.AsType() ?? typeof(UnknownRequestor);
    
    return new MyService(requestingType);
});

补充说明

  • 上述代码仅适用于MVC控制器发起的请求,如果服务是被其他非控制器类(比如另一个服务)请求,这种方法无法获取请求者类型。
  • 可以根据实际需求修改UnknownRequestor的逻辑,比如抛出异常或使用默认类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:42:41