使用Autofac替换Core中自带的DI
Autofac比Core中自带的DI功能强大的多,比如:属性注入、基于名称注入、子容器、自定生存期管理、迟缓初始化……
nuget安装Autofac 、 Autofac.Extensions.DependencyInjection
Core2.0中使用方法:
将Startup.cs中的ConfigureServices
返回类型改为IServiceProvider,然后新起一个方法RegisterAutofac把创建容器的代码放到其中
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
return RegisterAutofac(services);//注册Autofac
}
private IServiceProvider RegisterAutofac(IServiceCollection services)
{
services.AddAutofac();
//实例化Autofac容器
var builder = new ContainerBuilder();
//将Services中的服务填充到Autofac中
builder.Populate(services);
//新模块组件注册
//builder.RegisterModule<AutofacModuleRegister>();
//创建容器
var Container = builder.Build();
//第三方IOC接管 core内置DI容器
return new AutofacServiceProvider(Container);
}
以上是Core2.0替换方法,Core3.0不适用
Core 3.0版本替换方法:
.NET Core 3.0 引入了具有强类型容器配置的功能。它提供了ConfigureContainer 方法,您可以在其中使用Autofac来注册事物,而不必通过 ServiceCollection 来注册事物。
首先我们需要在 Program.cs 中修改服务工厂,内置是 ServiceProviderFactory 的,我们将要指定为: AutofacServiceProviderFactory
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .UseServiceProviderFactory(new AutofacServiceProviderFactory());
现在需要在 Startup.cs 中添加方法 ConfigureContainer ,并添加以下代码。
public void ConfigureContainer(ContainerBuilder builder) { }
然后大功告成,启动再也没问题了~。
替换完了。现在可以同时使用IServiceProvider、ILifetimeScope解析服务。
在ConfigureService中如何解析服务:
ServiceProvider serviceProvider = services.BuildServiceProvider();//通过ServiceCollection创建ServiceProvider,用ServiceProvider解析服务
未完待续...