.net core番外第一篇:Autofac的几种常见注入方式、生命周期和AOP
使用Autofac进行服务注册实践:
新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。
在Webapi项目下,引用Autofac的三个包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。

在类库下,Interface用于编写Interface接口类;Service用于开发对应的接口实现类。现在先准备了6个接口和实现,用来测试,方法实现都一样,都是打印当前方法名称。如图:

在webapi项目下的Program类里面,添加对autofac工厂(AutofacServiceProviderFactory)的服务实现。如图,需要先 using Autofac.Extensions.DependencyInjection;

在Startup类下面,新建无返回值的方法ConfigureContainer,并且带有一个ContainerBuilder类型的参数。然后在里面添加两个服务的注册,例如ServiceA和ServiceD,用来测试使用:

新增一个控制器TestController,并且实现一个叫Test方法的webapi,用来实验是否依赖注入服务生效:

运行程序,并调用webapi,验证依赖注入的结果:

Autofac依赖注入的几个相对常见的生命周期:
1、瞬时 InstancePerDependency:每次获取的服务实例都不一样;
2、单例 SingleInstance:在整个容器中获取的服务实例都是同一个;
3、作用域 InstancePerLifetimeScope:相同作用域下获取到的服务实例相同;
4、作用域 InstancePerMatchingLifetimeScope(“作用域名称”):可以指定到某一个具体作用域;
5、每次请求 InstancePerRequest:不同的请求获取的服务实例不一样;
6、隐式关系类型的嵌套作用域 InstancePerOwned:可以使用每一个拥有实例的注册来依赖关系限定到拥有的实例。
对应注册的方式如下代码所示:

现在对这些实例的生命周期做个测试,编写一些测试代码,用来验证生命周期:

在方法最后加个断点,然后运行程序。
A1和 A2是瞬时周期进行注册,每次都会产生不同的实例,所以两个实例不一样;
B1 和 B2是单例进行注册,会引用同一个实例,所以两者的实例相等;
C1和C2、C3和C4分别在两个作用域下进行作用域注册,所以在同一个作用域下,C1和C2、C3和C4的实例分别相等;但是C1和C3不属于同一个作用域,所以不相等。D1/2/3/4类似,不再描述。
详情,如图所示:

Autofac通过模块化进行注册服务
新建一个继承自Autofac.Module的类WeskyModule,并在里面提供Load方法的实现(在方法里面进行服务注册),下面使用一些其他方式进行注册,如代码以及注释部分:

在Startup类的ConfigureContainer方法下,注释之前的注册服务,改为引用Module模块来进行服务注册:

运行程序,在注册ServiceE的时候会提示错误,这是因为上面注册时候,排除了ServiceE所导致的,会提示服务没注册,如图:

现在先屏蔽掉对E服务的依赖,查看注册效果,直接在注册以后,访问注册服务的Hello方法,并运行查看结果。说明服务注册成功:

Autofac通过配置文件进行服务注册的方式
Autofac也可以通过配置文件进行注册服务,下面做个简单的例子。
新建一个叫做autofac.json的文件,然后在里面写上两个简单的单例注册。注意:新建的json文件需要设置为始终复制,防止生成以后没有存在根目录里面导致的找不到文件的问题。

然后在WeskyModule里面,注释掉先前的注册,使用以下代码进行获取配置文件的注册,并对A、B(B没有在文件里面注册,正常情况下应该是要报错的) 和C进行测试。

运行程序,可以看到由于B并没有在文件里面注册,所以运行到服务B时候,提示未注册服务异常:

由此可见,通过配置文件进行服务注册符合预期,测试完毕。
Autofac实现AOP切面功能
先添加Autofac.Extras.DynamicProxy的包:

新建一个叫做WeskyAOP的类,并且继承自,然后实现里面的Intercept方法,示例如下:

然后为了方便,我直接在下方新建一个IWeskyTest接口和WeskyTest类,并且提供一个Hello方法进行测试。以及对IWeskyTest添加了上面AOP的标记,如下:

返回WeskyModule里面,把先前注册的内容注释掉,然后添加对新增AOP服务的注册,以及新增服务接口的注册,此处注册为一个单例,不过会行不通,不信的可以自己尝试:

在Test控制器里面,添加对IWeskyTest接口服务的依赖注入,并在测试的api里面调用Hello方法进行测试。打印出AOP里面的两句语句,代表AOP实现成功。注意,以上使用单例或者其他的进行注册是不成功的,必须使用 EnableInterfaceInterceptors (需要using Autofac.Extras.DynamicProxy)

另外,把标记写到实现类上也是OK的,例如:

熬夜写博客太累了,未完,待续……后续继续更新Autofac的属性注入、以及过滤器里面实现依赖注入等方法,如有需要,欢迎提前关注。
如有需要有关资料或是本篇文章源码,可以点击下方Q群加入进行索要。
感谢观看,欢迎留言提供宝贵意见或推荐,谢谢!
.net core番外第一篇:Autofac的几种常见注入方式、生命周期和AOP的更多相关文章
- .net core番外第2篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果. 前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html 正文: Autof ...
- WEB安全番外第一篇--其他所谓的“非主流”漏洞:URL跳转漏洞与参数污染
一.URL跳转篇: 1.原理:先来看这段代码: <?php if(isset($_GET["url_redircetion_target"])){ $url_redirect ...
- JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】
什么是JSP JSP全名为Java Server Pages,java服务器页面.JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在! 为什么需要JSP JSP是为了简化Servle ...
- JAVA知识积累 JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】
什么是JSP JSP全名为Java Server Pages,java服务器页面.JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在! 为什么需要JSP JSP是为了简化Servle ...
- 番外特别篇之 为什么我不建议你直接使用UIImage传值?--从一个诡异的相册九图连读崩溃bug谈起
关于"番外特别篇" 所谓"番外特别篇",就是系列文章更新期间内,随机插入的一篇文章.目前我正在更新的系列文章是 实现iOS图片等资源文件的热更新化.但是,这两天 ...
- 深入理解this机制系列第一篇——this的4种绑定规则
× 目录 [1]默认绑定 [2]隐式绑定 [3]隐式丢失[4]显式绑定[5]new绑定[6]严格模式 前面的话 如果要问javascript中哪两个知识点容易混淆,作用域查询和this机制绝对名列前茅 ...
- ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探
前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...
- ASP.NET Core应用的7种依赖注入方式
ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...
- (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期
日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...
随机推荐
- 狂神说JUC学习笔记(二)
狂神说JUC的原版笔记: 链接:https://pan.baidu.com/s/12zrGI4JyZhmkQh0cqEO4BA 提取码:d65c 我的笔记在狂神的笔记上增加了一些知识点或者做了些许补充 ...
- fiddler抓取手机APP包相关的设置
一.设置手机的代理服务器 1.前提:手机与电脑用的是同一个网络 2.fiddler设置允许远程连接,并设置好端口 3.查询电脑所在网络的ip地址(windows下,命令行窗口使用:ipconfig进行 ...
- Bind DNS服务——转发与区域记录更新
Linux基础服务--Bind DNS服务 Part4 转发与区域记录更新 一个DNS服务器不可能保存所有的区域记录,所以我们一般都会将其他的区域纪录转发到其他的服务器上进行解析. Bind9提供了全 ...
- echarts迁移图动态加载
迁移图 获取迁移城市的经纬度 可以调用高德的接口,实现根据地名找寻经纬度的方法 #!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' 利用高德地图api实现 ...
- 支持向量机(SVM)之硬阈值
支持向量机 ( support vector machine, SVM ) 是使用超平面来对给定的 p 维向量进行分类的非概率二元线性分类器. 一.超平面 ( hyperplane ) 在一个p维的输 ...
- redis淘汰+过期双向保证高可用 | redis 为什么那么快?
前言 redis和数据相比除了他们的结构型颠覆以外!还有他们存储位置也是不相同.传统数据库将数据存储在硬盘上每次数据操作都需要IO而Redis是将数据存储在内存上的.这里稍微解释下IO是啥意思.IO就 ...
- RESTful API实践总结
REST架构 你是如何理解上网这件事的? 打开浏览器,输入网址,展现在你面前的就是一个网站了. 你可以在网站里看视频.看博客.写文章.听音乐. 但凡写过点代码的人都知道,我们平时访问的网站,其实是HT ...
- linux 下安装 docker 环境
一分钟了解 Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...
- 『无为则无心』Python基础 — 14、Python流程控制语句(while循环语句)
目录 1.什么是循环结构 2.while循环 (1)while循环的语法 (2)while循环的应用 3.while语句的死循环 4.break和continue 5.while循环嵌套 (1)应用场 ...
- 为什么要使用MongoDB?
1.Mongo与Mysql简单对比 关系型数据库-MySQL 1.在不同的引擎上有不同的存储方式. 2.查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 3.开源数据库的份额在不断增加 ...