Autofac RegisterModule与Microsoft.Extensions.DependencyInjection写法是否等价?
两段代码功能完全不等价
关键区别
- Autofac 代码的实际作用:调用
builder.RegisterModule时,Autofac会执行MyClassModule模块内部的Load方法——这是Autofac模块的核心逻辑,通常在这个方法里会批量注册一系列相关服务到容器中,而不是只把MyClassModule本身作为服务注册。 - Microsoft.Extensions.DependencyInjection 代码的实际作用:仅仅是将
MyClassModule的一个实例注册为单例服务,容器里只会存在这个实例,但不会触发模块内部的服务注册逻辑。模块原本要注册的其他服务,都不会被添加到DI容器中。
正确的替换方式
如果MyClassModule是Autofac专属模块,要替换成MSDI的话,需要把模块内部Load方法里的服务注册逻辑,手动迁移到扩展方法中,示例如下:
public static IServiceCollection AddApiModules(this IServiceCollection services, IConfiguration configuration) { // 把MyClassModule.Load方法里的注册逻辑迁移到这里 services.AddSingleton<IMyService, MyService>(); // 其他需要注册的服务... // 如果业务确实需要把MyClassModule本身作为服务注册,再添加这行 services.AddSingleton(new MyClassModule { PropPrefix = "abc", }); return services; // 原代码缺少返回值,必须补充才能支持链式调用 }
内容的提问来源于stack exchange,提问作者Sargis
相关产品推荐
相关产品推荐

