• AutoFac 具体使用知识总结

  • 阅读前提示 AutoFac 只是众多IOC框架的其中一种, 比较主流的有Unityautofacspring.netMEFInjectionAsp.Net CoreServiceCollection,等一些,还有一些,可能自己实现这一套东西。

1.为什么使用AutoFac? (自己的理解综合所链接的因素)

  1. 传说是速度最快的一个,轻量级性能高
  2. C#语言联系很紧密,许多框架如Abp都会有默认支持AutoFac,微软的Orchad开源程序使用的就是Autofac
  3. 支持很多的注入方式,除了传统的 构造函数注入,DI容器注入(使用 IServiceProvider 接口的对象) 如方法注入,属性注入,控制器注入 这些特殊的方式

    2.缺点
  4. 传说没有微软自带的 依赖注入 速度快
AutoFac 几种依赖注入使用方法介绍
  1. 演示绝大部分都是在 Startup.cs 里面进行的,也有一个测试的控制器TestController,重在理解,以下是自己研究的项目源码GitHub地址:

  2. 最基本的注入方式 通过DL容器的方式 一般的容器注入 初始

    1. IServiceCollection serviceDescriptors = new ServiceCollection();
      //指定关系
      serviceDescriptors.AddScoped<ITestAService, TestAService>();
      //build
      ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); //下面是作用域的关系比较 //1.同一个作用域 获取的实例 时同一个
      //var testA = (ITestAService)serviceProvider.GetService<ITestAService>();
      //var testA1 = (ITestAService)serviceProvider.GetService<ITestAService>();
      //var isEq = object.ReferenceEquals(testA, testA1); //2.再次Build时 范围声明周期 已经发生了变化
      //ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
      //var testA2 = (ITestAService)serviceProvider1.GetService<ITestAService>(); //var isEq1 = object.ReferenceEquals(testA1, testA2); //testA.show();
  3. AutoFac容器最简单的使用

    1. //容器构建着
      ContainerBuilder containerBuilder = new ContainerBuilder();
      //指定关系
      containerBuilder.RegisterType<TestAService>().As<ITestAService>();
      //构建
      IContainer container = containerBuilder.Build();
      //获取服务
      ITestAService testA3 = container.Resolve<ITestAService>();
      testA3.show();
  4. AutoFac容器 默认支持构造函数注入

    1. ContainerBuilder containerBuilder1 = new ContainerBuilder();
      containerBuilder1.RegisterType<TestAService>().As<ITestAService>();
      containerBuilder1.RegisterType<TestBService>().As<ITestBService>();
      IContainer container1 = containerBuilder1.Build();
      ITestBService testB = container1.Resolve<ITestBService>();
      testB.show();
  5. AutoFac容器 属性注入 PropertiesAutowired()

    1. ContainerBuilder containerBuilder2 = new ContainerBuilder();
      containerBuilder2.RegisterType<TestAService>().As<ITestAService>();
      containerBuilder2.RegisterType<TestBService>().As<ITestBService>();
      //支持属性注入的方法
      containerBuilder2.RegisterType<TestCService>().As<ITestCService>().PropertiesAutowired();
      IContainer container2 = containerBuilder2.Build(); ITestCService testC = container2.Resolve<ITestCService>();
      testC.show();
  6. AutoFac 支持的方法注入

    1. ContainerBuilder containerBuilder3 = new ContainerBuilder();
      containerBuilder3.RegisterType<TestAService>().As<ITestAService>();
      containerBuilder3.RegisterType<TestBService>().As<ITestBService>();
      //支持属性注入的方法
      containerBuilder3.RegisterType<TestCService>().As<ITestCService>().PropertiesAutowired();
      //方法注入
      //其中的SetSevice()方法是在 TestDService里面定义的一个方法
      containerBuilder3.RegisterType<TestDService>().OnActivated(a => a.Instance.SetSevice(a.Context.Resolve<ITestAService>())).As<ITestDService>();
      //使用
      IContainer container3 = containerBuilder3.Build();
      ITestDService testD = container3.Resolve<ITestDService>();
      testD.show();
  7. AutoFac 声明周期 瞬时(每次获取对象都是一个全新的实例) 示例

  8.  ContainerBuilder containerBuilder4 = new ContainerBuilder();
    containerBuilder4.RegisterType<TestAService>().As<ITestAService>().InstancePerRequest(); //InstancePerDependency 瞬时
    //InstancePerLifetimeScope() 范围
    // InstancePerMatchingLifetimeScope("name名称") *匹配 name* 声明周期范围实例
    //SingleInstance 单例
    //InstancePerRequest 每一个请求,一个实例 IContainer container4 = containerBuilder4.Build();
    ITestAService testA4 = container4.Resolve<ITestAService>();
    ITestAService testA5 = container4.Resolve<ITestAService>();
    //比较
    var IsEq = object.ReferenceEquals(testA4, testA5);
    Console.WriteLine(IsEq);
  9. AutoFac 特殊的控制器中使用 属性注入方式

    1. 需要使用两个特性来实现

    2. CustomPropertyAttribute 特性用来 当作标识,且声明只能是属性才能使用该特性

    3. CustomPropertySelector 特性是需要给控制器告知哪些属性是可以注入的 (需要一个判断的维度)

    4. 具体代码详见 GitHub 示例

  • 整个项目 使用AutoFac 自动构建 关系

    • 方式一 使用 配置文件 (完全断开对 实体的依赖)

      • 安装 支持的Nuget包

        • Autofac.Extensions.DependencyInjection
        • Autofac.Configuration
      • 内部好像也是用来反射Dll 来实现,感觉配置文件也挺复杂,所以就没有使用这种方案
    • 方式二 使用用反射来实现 ******

      • 1.收钱 需要在ConfigureServices 里面提供 控制器注入的支持

        •  //AutoFac 提供控制器支持
          //1 替换控制器的替换规则
          //1.1 可以指定控制器让 容器来创建
          services.Replace(ServiceDescriptor.Transient<IControllerActivator,ServiceBasedControllerActivator>());
        • 需要实现自定义实现ConfigureContainer方法,注意反射注入的方法需要写在这里面,不然没有效果

          • 代码如下

          • /// <summary>
            /// AutoFac 自己会调用这个方法 进行注册
            /// 1.负责注册 各种服务
            /// 2.ServiceCollection 注册的,也同样是可以使用的
            /// 3.还支持控制器 里面的属性注入
            /// </summary>
            /// <param name="builder"></param>
            public void ConfigureContainer(ContainerBuilder builder)
            {
            Assembly serviceDLL = Assembly.Load(new AssemblyName("WebApplicationApi")); //1.Service 后缀类的反射 注入
            var serviceTypes = serviceDLL.GetTypes().Where(t => t.Name.EndsWith("Service") && !t.GetTypeInfo().IsAbstract);
            foreach (var serviceType in serviceTypes)
            {
            //var asdfasf = serviceType.Name;
            foreach (var interType in serviceType.GetInterfaces())
            {
            var sname = serviceType.Name;
            var Iname = interType.Name;
            Console.WriteLine($"{sname}--->{Iname}");
            builder.RegisterType(serviceType).As(interType).InstancePerDependency()
            .AsImplementedInterfaces()//自动以其实现的所有接口类型暴露(包括IDisposable接口)
            .InstancePerLifetimeScope()
            .PropertiesAutowired();//支持属性注入的方法;
            }
            } //2 首先需要在Service,里面提供支持 services.Replace(.......)
            //2.1 控制器实例的注入
            var controllerTypes = typeof(Startup).GetTypeInfo().Assembly.DefinedTypes.
            Where(x => x.IsClass && typeof(ControllerBase).GetTypeInfo().IsAssignableFrom(x)).
            Select(x => x.AsType()).
            ToArray();
            builder.RegisterTypes(controllerTypes)
            //支持属性注入的方法;
            //CustomPropertySelector 设置哪些是可以被注入的 (指定特性属性注入的支持)
            .PropertiesAutowired(new CustomPropertySelector()); }
      • 这样就能直接在控制里面使用了

        • 具体使用如下

以上就是AutoFac的一些基本使用方法,欢迎大家讨论,转载请标明原创地址~ 谢谢~~~Bye~

.Net Core AutoFac 使用方法讲解大全,具体详细使用知识总结的更多相关文章

  1. ssh 配置文件讲解大全 ssh调试模式 sftp scp strace进行调试 特权分离

    ssh 配置文件讲解大全  ssh调试模式  sftp scp strace进行调试  特权分离 http://blog.chinaunix.net/uid-16728139-id-3265394.h ...

  2. .net core Autofac IOC 容器的简单使用

    书接上回,介绍了.net core 读取配置文件的几种方式,本文学习Autofac的同时再次增加一种读取配置文件的方法. 本文介绍Auofac,一个优秀的.NET IOC框架 源码地址:https:/ ...

  3. linux下生成core dump文件方法及设置

    linux下生成core dump文件方法及设置    from:http://www.cppblog.com/kongque/archive/2011/03/07/141262.html core ...

  4. 【转】Nginx服务器的反向代理proxy_pass配置方法讲解

    [转]Nginx服务器的反向代理proxy_pass配置方法讲解 转自:http://www.jb51.net/article/78746.htm 就普通的反向代理来讲Nginx的配置还是比较简单的, ...

  5. MySQL 升级方法指南大全

    原文:MySQL 升级方法指南大全 通常,从一个发布版本升级到另一个版本时,我们建议按照顺序来升级版本.例如,想要升级 MySQL 3.23 时,先升级到 MySQL 4.0,而不是直接升级到 MyS ...

  6. AJAX方法讲解

    Ajax的方法讲解 Ajax 异步请求,有点: 调高用户的体验度, 降低网络传输量 $.load() //异步加载页面 $.post()  Post 异步请求 $.post("url请求地址 ...

  7. iOS7中UIView的animateKeyframesWithDuration方法讲解

    iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那 ...

  8. NSArray排序方法讲解

    NSArray排序方法讲解 给数组排序有着多种方式 最麻烦的是sortedArrayUsingSelector:,其次是sortedArrayUsingDescriptors:,最容易使用的就是sor ...

  9. 007-对象—— static静态方法属性内存构成及使用方法讲解

    <?php /* 7 对象 static静态方法属性内存构成及使用方法讲解 */ /*class a{ public $uname=11; static public function _a() ...

  10. core dump使用方法、设置、测试用例

    core dump使用方法.设置.测试用例 http://blog.csdn.net/liuzhuchen/article/details/21975227

随机推荐

  1. eclipse配置Maven本地仓库

    一.首先下载maven插件并配置maven的环境变量,可参考:http://jingyan.baidu.com/article/cb5d61050b8ee7005d2fe04e.html 二.打开ec ...

  2. MyBatis实现多行合并(collection标签使用)

    举个栗子 现有如下表结构,用户表.角色表.用户角色关联表. 一个用户有多个角色,一个角色有可以给多个用户,也即常见的多对多场景. 现有这样一个需求,分页查询用户数据,除了用户ID和用户名称字段,还要查 ...

  3. SpringBoot事务注解@Transactional 事物回滚、手动回滚事物

    处理springboot 下提交事务异常,数据库没有回滚的问题. spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作. 什么 ...

  4. 硬件开发笔记(七): 硬件开发基本流程,制作一个USB转RS232的模块(六):创建0603封装并关联原理图元器件

    前言   有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了贴片电阻电容0603芯片封装,创建 ...

  5. dataclass装饰器

    简介 根据定义dataclass时指"一个带有默认值的可变的namedtuple" 简单来说,就是你定义一个很普通的类,@dataclass装饰器可以 帮你生成__repr__._ ...

  6. 记录一个错误:Traceback (most recent call last): from pip._internal.cli.main import main ImportError: No module named pip._internal.cli.main

    问题描述 在安装yaml时得到报错如下 root@ag-virtual-machine:/home/ag/test_script# pip install pyyaml Traceback (most ...

  7. 【LeetCode回溯算法#04】组合总和I与组合总和II(单层处理位置去重)

    组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target ...

  8. C++ //类模板与函数模板的区别 //1.类模板没有自动类型推导的使用方式 //2.类模板子模板参数中可以有默认参数

    1 //类模板与函数模板的区别 2 //1.类模板没有自动类型推导的使用方式 3 //2.类模板子模板参数中可以有默认参数 4 5 #include <iostream> 6 #inclu ...

  9. 玩转Vue3之Composables

    前言 Composables 称之为可组合项,熟悉 react 的同学喜欢称之为 hooks ,由于可组合项的存在,Vue3 中的组件之间共享状态比以往任何时候都更容易.这种新范例引入了一种更有组织性 ...

  10. nginx流量复制与放大

    1. 需求 功能需求 在不影响真实业务前提下,支持: 流量复制,用于线故障分析.系统迁移评估等 流量放大,通过多倍复制,实现放大流量,用于性能压测 配置需求 支持或禁止post请求复制 记录镜像请求的 ...