• ASP.NET Core 6.0 中使用 Autofac


    1. 引用NuGet包

    Install-Package Autofac -Version 6.3.0
    Install-Package Autofac.Extensions.DependencyInjection -Version 7.2.0
    

    2. Program 中注册使用

    2.1 普通注入

    builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
    builder.Host.ConfigureContainer<ContainerBuilder>(builder => {
        builder.RegisterType<A>().As<IA>();  // 直接注册某一个类和接口,左边的是实现类,右边的As是接口
    });
    

    2.2 反射程序集方式服务注册

    builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
    {
       var assemblysServices = Assembly.Load("Exercise.Services");
       containerBuilder.RegisterAssemblyTypes(assemblysServices)
                  .AsImplementedInterfaces()
                  .InstancePerLifetimeScope();
    });
    

    还可以进行选择性批量注入,注入之后通过 构造函数或者属性注入的方式使用。
    .net core 3.1 使用autofac注入,不同点只在于 Program 中的注册方式。

    3. AutoFac中常用方法说明

    基本概念

    1、AsImplementedInterfaces() 是以接口方式进行注入,注入这些类的所有的公共接口作为服务

    2、InstancePerRequest() 每次请求共享同一个实例,使用ef时,使不同的操作使用同一个数据上下文

    3、PreserveExistingDefaults() 如果不止一个组件暴露了相同的服务, Autofac将使用最后注册的组件作为服务的提供方,那么使用PreserveExistingDefaults防止后面注册的覆盖前面注册的

    builder.Register<A>() .As<IA>();
    
    builder.Register<AA>() .As<IA>();  // 这样AA就会覆盖A
    
    builder.Register<AA>() .As<IA>().PreserveExistingDefaults(); // 这样A是IA的默认值,不会被AA覆盖   
    

    4、InstancePerDependency为每个依赖或者调用(Resolve())都创建一个新的对象,唯一的实例

    5、SingleInstance 为每次请求都使用同一个对象,单例模式.告诉容器,是个单例,但这个单例不用自己实现。

    6、RegisterGeneric 对泛型类进行注册

    builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>))
    

    7、RegisterInstance() 注册一个实例,比如: 对已经存在的对象的实例进行注册,这样可以使实例转化为由容器托管的实例

    8、RegisterControllers() 注册Controllers

    builder.RegisterControllers(Assembly.GetExecutingAssembly()); // 注册当前程序集中的所有Controllers  
    

    9、RegisterFilterProvider() 注册Filter过滤器

    builder.RegisterFilterProvider()
    

    10、RegisterAssemblyTypes 注册类

    builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); // 注册了当前程序集内的所有的类
    

    11、InstancePerMatchingLifetimeScope 在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例。打了标识了的生命周期域中的子标识域中可以共享父级域中的实例

    builder.RegisterType<A>() .AsImplementedInterfaces() .InstancePerMatchingLifetimeScope();
    

    12、InstancePerHttpRequest在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发

    13、InstancePerLifetimeScope在一个生命周期中,每一次的依赖组件或调用(Resolve())创建一个单一的共享的实例,且每一个不同的生命周期域,实例是不同的

    14、UsingConstructor(参数) 自动装配,手动使用特定的构造函数

    builder.RegisterType<A>().UsingConstructor(typeof(IA),typeof(IAA)); // 这样指定调用的是A(IA,IAA)的构造函数,如果该构造函数不存在则报错
    

    15、[AsClosedTypesOf(open)]AsClosedTypesOf(typeof(IA<>)): 如果是多继承的话,注册的程序集所对应的服务(接口)是离这个类最近的开放的泛型实例(接口)

    builder.RegisterAssemblyTypes(A).AsClosedTypesOf(typeof(IRepository<>));
    

    Autofac中涉及的生命周期

    //1、瞬时生命周期:注册之后,每次获取到的服务实例都不一样(默认的注册方式)
    containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerDependency();
    //2、单例生命周期:整个容器中获取的服务实例都是同一个
    containerBuilder.RegisterType<UserService>().As<IUserService>().SingleInstance();
    //3、作用域生命周期:在相同作用域下获取到的服务实例是相同的
    containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
    //4、作用域生命周期:可以指定到某一个作用域,然后在相同作用域下共享服务实例
    containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerMatchingLifetimeScope("My");
    //5、http请求上下文的生命周期:在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。
    containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerRequest();
    //6、拥有隐式关系类型的创建新的嵌套生命周期的作用域,在一个生命周期域中所拥有的实例创建的生命周期中,
    //  每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周期域共享父生命周期域中的实例
    containerBuilder.RegisterType<UserService>().InstancePerOwned<IUserService>(); 
    
  • 相关阅读:
    分享一个本人打造的公众号吸粉、推广方案。
    iOS开发简记(8):数据持久化
    iOS开发简记(7):网络请求模块
    iOS开发简记(6):storyboard的使用
    iOS开发简记(5):设备唯一标识与全局变量
    iOS开发简记(4):录音AVAudioRecorder
    iOS开发简记(3):tips提示
    iOS开发简记(2):自定义tabbar
    spring+mybatis+springMVC框架配置多数据源
    Docker常用操作
  • 原文地址:https://www.cnblogs.com/shenghuotaiai/p/16144277.html
Copyright © 2020-2023  润新知