RequestServices.GetService()是否显著影响性能?无法构造注入时使用它是否为不良实践?
关于RequestServices.GetService()的性能与实践合理性
1. 性能表现
你完全不用担心性能问题:
RequestServices.GetService()的本质是从当前请求的作用域服务容器中查找对应服务注册项,核心是字典查找操作,单次调用开销在纳秒级别,对于高频请求场景完全可以忽略。- 它和构造函数注入的性能几乎没有差异:构造函数注入本质上也是DI容器在实例化类型时,自动调用
GetService()获取依赖传入构造函数,你手动调用只是把依赖查找的时机从实例化阶段延后到了方法执行阶段,底层查找逻辑完全一致。
2. 实践合理性判断
你当前的场景使用GetService()不属于不良实践:
- 大家常说的「服务定位器是反模式」的前提是:明明可以通过构造函数注入明确声明依赖的场景下,刻意使用服务定位器隐藏依赖关系,导致代码可维护性、可测试性下降。
- 而你的场景是客观上无法使用构造注入:Attribute类型是由ASP.NET Core框架直接实例化,不受DI容器管理,这种场景下通过
RequestServices获取服务是官方明确推荐的标准实现方式。
3. 代码优化建议
你当前的代码可以做小幅优化提升安全性:
public async Task OnAuthorizationAsync(AuthorizationFilterContext context) { // 用泛型版本避免手动强转,GetRequiredService会在服务不存在时主动抛出明确异常 var config = context.HttpContext.RequestServices.GetRequiredService<IConfiguration>(); ... }
如果你的配置不需要支持热重载,还可以把IConfiguration实例缓存到静态字段,进一步消除每次调用GetService()的极小开销:
public class YourCustomAttribute : Attribute, IAsyncAuthorizationFilter { private static IConfiguration _cachedConfig; public async Task OnAuthorizationAsync(AuthorizationFilterContext context) { _cachedConfig ??= context.HttpContext.RequestServices.GetRequiredService<IConfiguration>(); var config = _cachedConfig; ... } }
内容的提问来源于stack exchange,提问作者davewilliams459
相关产品推荐
相关产品推荐

