.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获取当前请求对应的控制器类型,步骤如下:
- 先注册
IHttpContextAccessor服务:
builder.Services.AddHttpContextAccessor();
- 修改
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
相关产品推荐
相关产品推荐

