如何在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
相关产品推荐
相关产品推荐

