.NET Core 2.2如何在Startup中获取依赖注入类实例并执行
在.NET Core 2.2中Startup初始化完成后执行依赖注入的代码
没问题,我来帮你搞定这个需求!其实用.NET Core内置DI实现起来很简单,分两步走就行:
第一步:把RunAfterStartup注册到DI容器
因为这个类依赖已注册的IInjectedService,你得先告诉DI容器怎么创建它的实例。在ConfigureServices方法里添加一行注册代码,根据你的业务需求选择合适的生命周期(Transient/Singleton/Scoped):
public void ConfigureServices(IServiceCollection services) { services.AddSingleton(typeof(IInjectedService), typeof(InjectedService)); // 注册RunAfterStartup,这里用Transient示例,你可以按需调整 services.AddTransient<RunAfterStartup>(); // ...其他服务注册代码 }
第二步:在Configure中获取实例并执行方法
你选的Configure方法位置完全没问题,这里可以通过app.ApplicationServices(内置DI的服务提供者IServiceProvider)来获取实例:
public void Configure(IApplicationBuilder app) { app.UseMvc(); // 从DI容器中获取RunAfterStartup实例,GetRequiredService找不到会抛异常,比GetService更严谨 var runAfterStartup = app.ApplicationServices.GetRequiredService<RunAfterStartup>(); runAfterStartup.Foo(); }
特殊情况:如果涉及Scoped生命周期服务
如果RunAfterStartup或者它依赖的服务是Scoped类型,直接用上面的方式会报错,这时候需要手动创建一个服务作用域:
public void Configure(IApplicationBuilder app) { app.UseMvc(); using (var scope = app.ApplicationServices.CreateScope()) { var scopedProvider = scope.ServiceProvider; var runAfterStartup = scopedProvider.GetRequiredService<RunAfterStartup>(); runAfterStartup.Foo(); } }
更简洁的写法(仅限非Scoped服务)
Configure方法本身支持直接注入已注册的服务参数,如果你用的是Singleton或Transient生命周期,还可以这么写:
public void Configure(IApplicationBuilder app, RunAfterStartup runAfterStartup) { app.UseMvc(); runAfterStartup.Foo(); }
对比你之前用SimpleInjector的container.GetInstance,其实核心逻辑是一致的——都是从DI容器中获取已注册类型的实例,只是内置DI用的是GetRequiredService这个API而已。
内容的提问来源于stack exchange,提问作者Cristi
相关产品推荐
相关产品推荐

