如何在.NET Core控制台泛型主机中使用Autofac替代默认DI容器?
替换步骤
- 首先安装Autofac适配.NET泛型主机的依赖包
你可以通过NuGet包管理器搜索安装Autofac.Extensions.DependencyInjection,也可以执行命令安装:
dotnet add package Autofac.Extensions.DependencyInjection
- 其次修改Program.cs中的CreateHostBuilder配置,添加Autofac服务提供工厂即可完成替换
你原本在ConfigureServices中注册的服务不需要修改,Autofac会自动合并默认DI容器中的所有服务注册,如果你需要使用Autofac的专属特性(比如命名注册、属性注入、拦截器等),可以新增ConfigureContainer<ContainerBuilder>配置块来写Autofac风格的注册逻辑。
修改后的完整代码如下:
using Autofac; using Autofac.Extensions.DependencyInjection; // 保留你原有项目的其他using引用即可 public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) // 新增此行,替换默认服务提供器为Autofac .UseServiceProviderFactory(new AutofacServiceProviderFactory()) // 可选:添加Autofac专属注册块,需要用Autofac高级特性时添加即可 .ConfigureContainer<ContainerBuilder>(builder => { // 示例:把IThumbnailProcessor的注册挪到Autofac块实现,也可以保留原来的注册逻辑 // builder.RegisterType<ThumbnailProcessor>().As<IThumbnailProcessor>().SingleInstance(); }) .ConfigureAppConfiguration((hostContext,configBuilder) => { configBuilder.AddEnvironmentVariables(prefix: "ImageService_"); }) .ConfigureServices((hostContext, services) => { services.AddHostedService<ImageFileWatcher>(); services.AddSingleton<IThumbnailProcessor, ThumbnailProcessor>(); var config = hostContext.Configuration; services.AddOptions<ImageConfig>() .Configure(imageConfig => { imageConfig.CompressionLevel = 0.99M; }) .Bind(config.GetSection(nameof(ImageConfig))); services.AddOptions<ImageSizeConfig>(ImageSizeConfig.Thumbnail) .Configure(thumbnailSizeConfig => { thumbnailSizeConfig.FilePrefix = "thumb-"; }) .Bind(config.GetSection("ImageConfig:thumbnail")); services.Configure<ImageSizeConfig>(ImageSizeConfig.Medium, config.GetSection("ImageConfig:medium")); services.Configure<ImageSizeConfig>(ImageSizeConfig.Large, config.GetSection("ImageConfig:large")); }); }
配置完成后启动项目即可正常使用Autofac作为DI容器,你原有项目的构造函数注入等逻辑不需要做任何修改。
内容的提问来源于stack exchange,提问作者bmo
相关产品推荐
相关产品推荐

