You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:23:12