能否根据用户参数动态注入依赖的不同实现?
根据用户参数动态注入依赖的不同实现
完全可以实现这种基于用户参数动态选择依赖实现的需求,具体实现步骤如下:
完成基础依赖注册
- 先注册
IHttpContextAccessor(ASP.NET Core默认不会自动注册该服务) - 注册
IRequestService对应的两个具体实现类
- 先注册
编写动态解析逻辑
在AddScoped的工厂委托中,根据用户Claims信息判断并返回对应的实现实例
完整代码示例:
// 注册IHttpContextAccessor,用于获取当前请求上下文 services.AddHttpContextAccessor(); // 注册IRequestService的两个具体实现类 services.AddScoped<RequestServiceFoo>(); services.AddScoped<RequestServiceDefault>(); // 动态注入逻辑:根据用户Claims选择对应实现 services.AddScoped<IRequestService>(serviceProvider => { var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>(); var currentUser = httpContextAccessor.HttpContext?.User; // 判断用户是否包含指定值的Claim if (currentUser?.Claims.Any(claim => claim.Value == "foo") == true) { return serviceProvider.GetRequiredService<RequestServiceFoo>(); } else { return serviceProvider.GetRequiredService<RequestServiceDefault>(); } });
关键细节说明
- 使用
GetRequiredService替代GetService,确保依赖项不存在时抛出明确异常,便于排查问题 - 对
HttpContext和User进行空值判断,避免空引用异常 RequestServiceFoo和RequestServiceDefault需实现IRequestService接口
内容的提问来源于stack exchange,提问作者filur
相关产品推荐
相关产品推荐

