ASP.NET Core-使用Autofac替换Core中自带的DI

 使用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解析服务

 

未完待续...

原文地址:https://www.cnblogs.com/fanfan-90/p/12144837.html