.NET Core 3.1依赖注入如何获取已注册类型的实例
如何在.NET Core 3.1依赖注入中正确获取已注册服务实例
错误原因
ConfigureServices 阶段仅负责收集服务注册信息,依赖注入容器尚未完成构建,此时直接调用容器的实例获取方法(如GetInstance/Resolve)必然执行失败。
正确实现方案
你需要使用服务注册方法的工厂重载,委托框架在容器构建完成、首次需要实例化该服务时,再通过构建完成的IServiceProvider获取依赖。
原生.NET Core DI实现代码
public class Startup { public void ConfigureServices(IServiceCollection services) { // 先注册业务服务,生命周期按需选择Scoped/Singleton/Transient services.AddScoped<IBusinessLogic, BusinessLogic>(); // 使用带IServiceProvider参数的工厂重载,该工厂执行时容器已完成构建 services.AddSingleton<Func<string, string, JWTCache>>(sp => { return (username, password) => new JWTCache( userId: username, password: password, businessLogic: sp.GetRequiredService<IBusinessLogic>() ); }); } }
额外说明
- 你原有代码中的
Func<string, string>签名有误,按你的业务逻辑返回值为JWTCache,应改为Func<string, string, JWTCache>。 - 如果你使用第三方DI容器(如Autofac),逻辑完全一致:仅在注册阶段完成注册逻辑,实例获取操作放在工厂委托内,由容器在构建完成后触发执行。
- 如果需要在
Configure方法中直接获取服务,直接将服务声明为Configure的入参即可,宿主会自动完成注入:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IBusinessLogic businessLogic) { // 此处可直接使用注入的businessLogic实例 }
内容的提问来源于stack exchange,提问作者191180rk
相关产品推荐
相关产品推荐

