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

如何在Microsoft.Extensions.DependencyInjection中注册类型?Autofac转MS.DI实现

嘿,我来帮你搞定这两个关于Microsoft.Extensions.DependencyInjection(简称MS DI)的问题,都是日常迁移或使用中很常见的场景:

1. 在MS DI中注册类型的常见方式

MS DI围绕生命周期设计了核心注册方法,不同的生命周期对应不同的使用场景,下面是最常用的几种:

  • 瞬时(Transient):每次请求服务时都会生成全新实例,适合无状态的轻量级工具类服务

    // 直接注册类型本身
    services.AddTransient<MyService>();
    // 注册接口到具体实现类(依赖注入时可以通过接口获取实例)
    services.AddTransient<IMyService, MyService>();
    
  • 作用域(Scoped):在同一个作用域内(比如Web应用的单个请求周期)只会创建一个实例,像数据库上下文这类需要在请求内复用的服务就适合用这个

    services.AddScoped<MyDbContext>();
    services.AddScoped<IMyDbContext, MyDbContext>();
    
  • 单例(Singleton):整个应用运行期间只会创建一次实例,适合全局共享的状态服务或配置类

    services.AddSingleton<GlobalConfigService>();
    services.AddSingleton<IGlobalConfigService, GlobalConfigService>();
    

还有些进阶玩法,比如直接注册已实例化的对象:

var preCreatedInstance = new MyService();
services.AddSingleton<IMyService>(preCreatedInstance);

或者用工厂方法自定义实例创建逻辑:

services.AddTransient<IMyService>(serviceProvider => {
    // 先获取依赖的服务
    var dependency = serviceProvider.GetRequiredService<IDependency>();
    // 自定义实例初始化逻辑
    return new MyService(dependency, "custom parameter");
});

2. 将Autofac的注册代码转换为MS DI

你给出的Autofac代码:

builder.RegisterType<GrpcServer>().As<GrpcServer>()

其实这段代码就是把GrpcServer注册为它自身的服务(Autofac里As<GrpcServer>()和直接注册类型本身效果一致,属于冗余写法)。

在MS DI中,对应的写法非常直观,你只需要根据业务需求选择对应的生命周期即可:

  • 如果和Autofac默认行为(瞬时生命周期)保持一致:

    services.AddTransient<GrpcServer>();
    
  • 如果需要作用域生命周期:

    services.AddScoped<GrpcServer>();
    
  • 如果需要单例生命周期:

    services.AddSingleton<GrpcServer>();
    

要是你的GrpcServer实现了某个接口(比如IGrpcServer),需要通过接口来注入的话,写法就变成:

services.AddTransient<IGrpcServer, GrpcServer>();

这就对应Autofac里的builder.RegisterType<GrpcServer>().As<IGrpcServer>()。

内容的提问来源于stack exchange,提问作者sevenamelkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:53:37