Autofac使用(1)

news2025/2/22 13:38:19

            1.Nuget引入程序包
            2.得到容器的建造者
            3.配置抽象和具体类之间的关系
            4.Build一下得到容器实例
            5.基于容器来获取对象的实例了

1、基础使用

ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
IContainer container = containerBuilder.Build();
IMicrophone microphone = container.Resolve<IMicrophone>();

2、多种注册方式

            关于Autofac容器的多种注册
            {

                注册抽象和具体普通类

                {
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
                    IContainer container = containerBuilder.Build();
                    IMicrophone microphone = container.Resolve<IMicrophone>();
                }
                注册一个具体的实例
                {
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    containerBuilder.RegisterInstance(new Microphone());
                    IContainer container = containerBuilder.Build();
                    IMicrophone microphone = container.Resolve<Microphone>();
                }

                {
                    注册一段业务逻辑
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
                    containerBuilder.Register<IPower>(context =>
                    {
                        //这里的业务逻辑负责创建出IPower 的实例---可以给一个入口,我们自己来创建对象的实例
                        IMicrophone microphone = context.Resolve<IMicrophone>();
                        IPower power = new Power(microphone);

                        return power;
                    });
                    IContainer container = containerBuilder.Build();
                    IPower power = container.Resolve<IPower>();
                }

                注册泛型
                {
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    containerBuilder.RegisterGeneric(typeof(List<>)).As(typeof(IList<>));
                    containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
                    IContainer container = containerBuilder.Build();
                    IList<IMicrophone> microphonelist = container.Resolve<IList<IMicrophone>>();
                }

                注册程序集
                {
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    Assembly interfaceAssembly = Assembly.LoadFrom("Advanced.NET6.Business.Interfaces.dll");
                    Assembly serviceAssembly = Assembly.LoadFrom("Advanced.NET6.Business.Services.dll");
                    containerBuilder.RegisterAssemblyTypes(interfaceAssembly, serviceAssembly).AsImplementedInterfaces();
                    IContainer container = containerBuilder.Build();
                    IEnumerable<IMicrophone> microphonelist = container.Resolve<IEnumerable<IMicrophone>>();
                }

            }

3、构造函数注入

                {
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
                    containerBuilder.RegisterType<Power>().As<IPower>();
                    IContainer container = containerBuilder.Build();
                    IPower power = container.Resolve<IPower>();
                }

                如果有多个构造函数,默认选择构造函数参数最多构造函数了
                如果希望选择其中只有一个构造函数参数的构造函数
                {
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    containerBuilder.RegisterType<Microphone>()
                        .As<IMicrophone>();
                    containerBuilder.RegisterType<Power>()
                         .UsingConstructor(typeof(IMicrophone), typeof(IMicrophone)) //选择类型为IMicrophone 且参数的数量只有一个的构造函数
                        .As<IPower>();
                    IContainer container = containerBuilder.Build();
                    IPower power = container.Resolve<IPower>();
                }

4、属性注入

                //属性注入
                {
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
                    containerBuilder.RegisterType<Power>().As<IPower>();
                    containerBuilder.RegisterType<Headphone>().As<IHeadphone>();
                    containerBuilder.RegisterType<ApplePhone>().As<IPhone>()
                        .PropertiesAutowired(); //表示要支持属性注入: 在对象创建出来以后,自动给属性创建实例,赋值上去

                    IContainer container = containerBuilder.Build();
                    IPhone iPhone = container.Resolve<IPhone>();
                }

                //属性注入--支持PropertySelector
                {
                    ContainerBuilder containerBuilder = new ContainerBuilder();
                    containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
                    containerBuilder.RegisterType<Power>().As<IPower>();
                    containerBuilder.RegisterType<Headphone>().As<IHeadphone>();
                    containerBuilder.RegisterType<ApplePhone>().As<IPhone>()
                        .PropertiesAutowired(new CusotmPropertySelector()); //表示要支持属性注入: 在对象创建出来以后,自动给属性创建实例,赋值上去

                    IContainer container = containerBuilder.Build();
                    IPhone iPhone = container.Resolve<IPhone>();
                }
 [AttributeUsage(AttributeTargets.Property)]
 public class CusotmSelectAttribute:Attribute
 {
 }

 public class CusotmPropertySelector : IPropertySelector
 {
     public bool InjectProperty(PropertyInfo propertyInfo, object instance)
     {
         //在这里就是判断哪些属性是需要做属性注入的
         return propertyInfo.CustomAttributes.Any(c => c.AttributeType == typeof(CusotmSelectAttribute));
     }
 }

 5、方法注入

 //方法注入
 {
     ContainerBuilder containerBuilder = new ContainerBuilder();
     containerBuilder.RegisterType<Microphone>().As<IMicrophone>();
     containerBuilder.RegisterType<Power>().As<IPower>();
     containerBuilder.RegisterType<Headphone>().As<IHeadphone>();
     containerBuilder.RegisterType<ApplePhone>().As<IPhone>()
         .OnActivated(activa =>
     {
         IPower power = activa.Context.Resolve<IPower>();
         activa.Instance.Init123456678890(power);
     });

     IContainer container = containerBuilder.Build();
     IPhone iPhone = container.Resolve<IPhone>();
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 热题 100——找到字符串中所有字母异位词(滑动窗口)

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 该题目的意思简而言之就是说&#xff0c;从s字符串中寻找与p字符串含有相同字符(次数和种类均相同)的子串&#xff0c;并且将他们的首字符下标集合进数组中进行返回。 滑动窗口解…

arm64架构的linux中断分析

文章目录 1. 中断的概念和作用2. Linux中断处理机制2.1 中断请求2.2 中断处理2.3 中断完成2.4.中断触发和处理步骤详解2.4.1 异常向量表的解读 3. GICv3中断控制器3.1 GICv3中断控制器设备树3.2 GICv3中断控制器驱动 4. GIC的下一级中断控制器4.1 设备树4.2 内核对设备树的处理…

数学建模--退火算法求解最值的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ 1.设定退火算法的基础参数 2.设定需要优化的函数,求解该函数的最小值/最大值 3.进行退火过程&#xff0c;随机产生退火解并且纠正,直到冷却 4.绘制可视化图片进行了解退火整体过程 &…

Cyber RT学习笔记---2.基础概念汇总

2.基础概念汇总 在前面我们介绍了Cyber RT的基础介绍以及框架方面的知识&#xff0c;我们对Cyber RT是一个什么样的系统和框架有了一个大概的认知。这节我们将介绍一下Cyber RT中的一些基础且关键的概念&#xff0c;搞清楚这些概念所代表的意义以及作用&#xff0c;之后我们再…

2023年9月DAMA-CDGA/CDGP数据治理认证火热招生中

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

Android列表片段

下面创建第二个片段WorkoutFragment&#xff0c;它包含不同训练项目构成的一个列表&#xff0c;用户可以从这个列表中选择训练项目。 列表视图是只包含一个列表的片段 列表片段是一种专门处理列表的片段&#xff0c;它会自动绑定到一个列表视图&#xff0c;所以不需要另外创建…

【 Tkinter界面-练习03】实现动画

一、说明 在本教程中&#xff0c;我们将学习Python Tkinter Animation。在这里&#xff0c;我们将了解如何在 python 中使用 Tkinter 创建动画&#xff0c;并将介绍与动画相关的不同示例。我们还将讨论这些主题 二、Python Tkinter 动画 在本节中&#xff0c;我们将学习 Python…

服务器数据恢复- Ext4文件系统分区挂载报错的数据恢复案例

Ext4文件系统相关概念&#xff1a; 块组&#xff1a;Ext4文件系统的空间被划分为若干个块组&#xff0c;每个块组内的结构大致相同。 块组描述符表&#xff1a;每个块组都对应一个块组描述符&#xff0c;这些块组描述符统一放在文件系统的前部&#xff0c;称为块组描述符表。每…

【python爬虫】15.Scrapy框架实战(热门职位爬取)

文章目录 前言明确目标分析过程企业排行榜的公司信息公司详情页面的招聘信息 代码实现创建项目定义item 创建和编写爬虫文件存储文件修改设置 代码实操总结 前言 上一关&#xff0c;我们学习了Scrapy框架&#xff0c;知道了Scrapy爬虫公司的结构和工作原理。 在Scrapy爬虫公司…

基于IPV6带外BMC在中兴R5500G4服务器上安装ESXi7.0U3n

本文讲解通过IPV6方式从带外BMC在中兴R5500G4服务器上安装VMWare ESXi7.0U3n的过程。 一、安装环境 服务器&#xff1a; 中兴R5500G4服务器(2*16C/384GB MEM/2*480GB SSD/24*8TB SATA/12*960GB SSD/8*10Ge) ISO&#xff1a;VMware-VMvisor-Installer-7.0U3n-21930508.x86_64…

zabbix配置钉钉告警、和故障自愈

钉钉告警python脚本 cat python20 #!/usr/bin/python3 #coding:utf-8 import requests,json,sys,os,datetime # 机器人的Webhook地址 webhook"钉钉" usersys.argv[1] textsys.argv[3] data{"msgtype": "text","text": {"conten…

UniTask保姆级教程

目录 一、UniTask的简介和安装 https://github.com/Cysharp/UniTask.gitpathsrc/UniTask/Assets/Plugins/UniTask 空载性能测试 二、基础用法详解 三、基础用法扩展 四、进阶 五、VContainer简介 六、VContainer基础实例 方便快速查找 一、UniTask的简介和安装 项目地…

如何使用蚂蚁集团自动化混沌工程 ChaosMeta 做 OceanBase 攻防演练?

当前&#xff0c;业界主流的混沌工程项目基本只关注如何制造故障的问题&#xff0c;而经常做演练相关工作的工程师应该明白&#xff0c;每次演练时还会遇到以下痛点&#xff1a; 检测当前环境是否符合演练预设条件&#xff08;演练准入&#xff09;&#xff1b; 业务流量是否满…

第四章网关

文章目录 Gateway服务网关为什么需要网关gateway快速入门断言工厂过滤器工厂路由过滤器的种类默认过滤器全局过滤器自定义全局过滤器 过滤器执行顺序 跨域问题什么是跨域问题 Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 S…

基于3D数字孪生系统开展水环境治理与修复的功能特点

“小水滴”折射“大民生”&#xff0c;城市供水是极为重要的民生工程、民心工程。上海市委、市政府始终把提高城市供水安全韧性摆在突出位置&#xff0c;着力打造更加完善、更高质量的城市供水网络体系&#xff0c;夯实筑牢城市供水生命线&#xff0c;确保城市水安全。经过多年…

TFTP服务器,NFS服务器

一&#xff0c;安装tftp服务器 1&#xff0c;什么是tftp服务器&#xff1f; tftp服务器是通过网络&#xff0c;将ubuntu程序下载到开发板中 2&#xff0c;安装步骤 1&#xff0c;保证连接外网成功 2&#xff0c;安装tftp服务器 sudo apt-get install tftp-hpa tftpd-hpat…

算法笔记 近似最近邻查找(Approximate Nearest Neighbor Search,ANN)

1 介绍 精准最近邻搜索中数据维度一般较低&#xff0c;所以会采用穷举搜索&#xff0c;即在数据库中依次计算其中样本与所查询数据之间的距离&#xff0c;抽取出所计算出来的距离最小的样本即为所要查找的最近邻。 当数据量非常大的时候&#xff0c;搜索效率急剧下降。——>…

公共实训中心物联网技术应用实训室建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

百度低质量站点怎么办?解决百度低质量站点的方法和工具

百度低质量站点怎么恢复&#xff1f;这是许多网站主和运营人员在SEO优化过程中经常面临的一个问题。百度作为中国最大的搜索引擎&#xff0c;对于网站收录和排名具有至关重要的影响。然而&#xff0c;由于各种原因&#xff0c;有些网站可能面临被百度降权或收录减少的情况。那么…

Netty服务端启动的整体流程-基于源码4.1.96Final分析

Netty采用的是主从Reactor多线程的模型&#xff0c;参考Scalable IO in Java&#xff0c;但netty的subReactor为一个组 一、从FileServer服务器示例入手 public final class FileServer {static final boolean SSL System.getProperty("ssl") ! null;// Use the …