一文学会Autofac的基础操作:几种实现注册方式、3种注入方式、生命周期、AOP以及过滤器实现依赖注入...

前言:直接开干。

使用Autofac进行服务注册实践:

新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。

在Webapi项目下,引用Autofac的三个包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。

 304cd7fb821ddbf3a9659ef22bc08c8a.png

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

 683c2a45cb900ae063019ae49ba4d07d.png

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

 ca3f022e6d0c87fdcac92f5dcd3d8e1d.png

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

ef67e53515615d491a95ac658b88adb0.png 

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

 0c51646cc19f3873f5c47676c296faff.png

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

 2934b88078448f57606fa2d79b7b9d32.png

Autofac依赖注入的几个相对常见的生命周期

1、瞬时 InstancePerDependency:每次获取的服务实例都不一样;

2、单例 SingleInstance:在整个容器中获取的服务实例都是同一个;

3、作用域 InstancePerLifetimeScope:相同作用域下获取到的服务实例相同;

4、作用域 InstancePerMatchingLifetimeScope(“作用域名称”):可以指定到某一个具体作用域;

5、每次请求 InstancePerRequest:不同的请求获取的服务实例不一样;

6、隐式关系类型的嵌套作用域 InstancePerOwned:可以使用每一个拥有实例的注册来依赖关系限定到拥有的实例。

对应注册的方式如下代码所示:

 2f8789d8639ed036c52a8eb5b0a672b4.png

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

 24869757229a5fdc87f6090c88a9c966.png

在方法最后加个断点,然后运行程序。

A1和 A2是瞬时周期进行注册,每次都会产生不同的实例,所以两个实例不一样;

B1 和 B2是单例进行注册,会引用同一个实例,所以两者的实例相等;

C1和C2、C3和C4分别在两个作用域下进行作用域注册,所以在同一个作用域下,C1和C2、C3和C4的实例分别相等;但是C1和C3不属于同一个作用域,所以不相等。D1/2/3/4类似,不再描述。

详情,如图所示:

 011e6f1db7a157f094b44210c5b0d5ce.png

Autofac通过模块化进行注册服务

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

 edd6f1b9e92706d3cf2fc80a41bdbaf5.png

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

 5968f492e4485e53c11e938fea3c53e5.png

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

 be2a326bd5702f9d10ca7733a57187f6.png

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

 d976305e0e6590ae7967a2b43869f204.png

Autofac通过配置文件进行服务注册的方式

Autofac也可以通过配置文件进行注册服务,下面做个简单的例子。

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

 797712bf93630d5cb804133dd394e8d0.png

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

 ddbea28bcd1c2e0350ab4162260c2025.png

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

 f98ed37939d09f40a641dbf138cac9ec.png

由此可见,通过配置文件进行服务注册符合预期,测试完毕。

Autofac实现AOP切面功能

先添加Autofac.Extras.DynamicProxy的包:

 1df0b1e1eebbeb0ed454a7bc233679f4.png

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

 190f8548fc2d2689679ac5636b6591bb.png

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

 48a945e4c29f76e76da4105749c2db81.png

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

 fe02630aaf07920a68e4efa1ba2d33ec.png

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

 c98389efe1651ca98a0722b37bc1ef93.png

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

 8294a3ab03d5795e14f3163de8267c59.png

Autofac通过构造函数注入

如前面内容所示,获取实例都是通过构造函数进行。此处通过构造函数获取实例,还有一种通过构造函数传入IServiceProvider进行获取。该方法可以极大减少构造函数传入的实例过多所导致的构造函数参数臃肿。示例直接使用前篇项目做拓展,在控制器的测试api下面,直接使用。有关示例如下图所示:

 c54a56e9a52368b6f4c4706f5afcbd4c.png

设置断点,并运行程序查看效果。可见IWeskyTest接口已经被注入进来,并且可以访问到

 c4d231066c579ee6850ef11941d02747.png

Autofac通过属性注入方式

在ServiceA实现类里面,添加IServiceB、IServiceC的属性。并且在ServiceA实现类里面,添加一个测试方法 Hey(),在里面对以上两个属性所对应的接口方法进行调用。代码如下:

 12683c5762fc45443cb26c3e7540f0f8.png

以及Hey需要加入到抽象类接口IServiceA:

 0ea0f49fe22b4b76a63561b48e58209d.png

对IServiceA\B\C进行服务注册。其中,提供属性的服务,注册时候必须使用PropertiesAutowired方式,如下面代码所示:

 6044cd1f04ade5f4972c3ab401d116cb.png

接着改写控制器里面的Test方法进行测试。对应代码以及解释和对应的运行结果如下图所示:

 0b5fecfcc4b6a0c5dc5d78a5902e23e7.png

Autofac通过方法注入方式

改写上面ServiceA的类为如下代码。有关代码说明如图:

 b461c40aed857231985fbed8bd0863c7.png

对用到的IServiceA和B进行服务注册。如图所示,ServiceA里面提供了方法注入,所以需要在注册A服务的时候,使用OnActivated方法。其中,RegisterService是ServiceA服务里面提供的需要当做方法注入的方法,方法里面的IServiceB是需要被方法注入的抽象类(接口)。以下使用了瞬时,也可以使用其他的,没有限制,包括ServiceB服务注册时候,也可以使用非单例模式,不做限制。

 3b1af12668d57ed2646491c3c8d84771.png

运行程序,如果先后打印ServiceA 和 ServiceB,则代表方法注入成功。运行程序结果如下:

 71defa6daf3c51b0ce7c76df96b1a849.png

Filter过滤器里面实现支持依赖注入

先编写一个过滤器WeskyFilter,继承自 ActionFilterAttribute。并且在里面添加一个属性注入的IServiceC和一个构造函数注入的IServiceD。

然后在OnActionExecuting和OnActionExecuted方法下面实现一个打印的内容,并且分别打印ServiceC实例和ServiceD实例下面的Hello方法。代码如下:

 9a7c5d183fcecb8619baaa28649ab8bf.png

对IServiceC、D进行服务注册,以及注册WeskyFilter过滤器,用以支持依赖注入:

 42b424c30919598927b90b30815e90b3.png

在控制器里面的Test方法上面,添加过滤器标记,并直接运行进行结果验证:

 4f44d9f8c42e460fa52bfdb37cff88c3.png

如图所示,打印出过滤器里面的内容,并且成功访问到了ServiceC和D的Hello方法,代表在过滤器里面实现依赖注入也是可以的。

如果觉得有帮助,欢迎转发、在看和留言。

如果对.NET技术感兴趣,或者愿意分享自己的知识,也欢迎扫码加入我的群聊,7天内有效:

d2aa65ba3a0c022b4a67aa512a40d37f.png

最后再次感谢大家观看~谢谢大家。

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

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

相关文章

JavaScript数组迭代方法(图解)

转载于:https://www.cnblogs.com/seanna/p/6724032.html

Rider调试ASP.NET Core时报thread not gc-safe的解决方法

新建了一个ASP.NET Core 5.0的Web API项目,当使用断点调试Host.CreateDefaultBuilder(args)时,进入该函数后查看中间变量的值,报错Evaluation is not allowed: The thread is not at a GC-safe point。在群里问了也没人回应,可能没…

The SDK platform-tools version ((23)) is too old to check APIs compiled with API 26;

好像是更新过啥SDK之后,项目一直在包名的那一行显示红线,不过是不报编译错误的,就是看着老扎心老扎心的,开始以为是指定的SDK版本的问题,修改后发现无效,最后找到方法解决: 打开SDK Manager ---…

oracle 各种日期函数格式和操作

2019独角兽企业重金招聘Python工程师标准>>> ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits 三位年 显示值:00…

火山引擎李玉光:字节跳动大规模K8s集群管理实践

2022年5月31日,在CSDN云原生系列在线峰会第6期“K8s大规模应用和深度实践峰会”,火山引擎资深云原生架构师李玉光分享了《字节跳动大规模K8s集群管理实践》。 字节跳动云原生体系 字节跳动内部云原生技术的使用贯穿组织技术体系各层面,整体如…

(7)关于margin的一些想法2.0

这篇主要讨论的就是margin负值与float的关系。 首先&#xff0c;例子。 <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style typetext/css> html,body{padding:0;margin:0;} div{wid…

什么是SRE?一文详解SRE运维体系

在任何有一定规模的企业内部&#xff0c;一旦推行起来整个SRE的运维模式&#xff0c;那么对于可观测性系统的建设将变得尤为重要&#xff0c;而在整个可观测性系统中。 可观测性系统 在任何有一定规模的企业内部&#xff0c;一旦推行起来整个SRE的运维模式&#xff0c;那么对于…

python初探

python近两年似乎已经很热了&#xff0c;不了解一下怎么能行呢&#xff0c;似乎python最大的优点就是简洁、易懂、优雅。目前豆瓣、知乎等后台服务使用的也都是python语言。 python一般可以用于网站服务、小工具、数据分析等工作。它作为高级语言&#xff0c;和js一样&#xff…

solr5.5索引mysql数据(新手总结)

一 solr5.5环境部署到Eclipse(luna版&#xff09; solr部署参见&#xff1a;http://blog.csdn.net/csmnjk/article/details/64121765 二 Ik分词器设置 IK分词器设置参见:http://blog.csdn.net/csmnjk/article/details/51693578 solr4版本的schema.xml文件对应solr5版本的manage…

老板加薪!看我做的WPF Loading!!!

老板加薪&#xff01;看我做的WPF Loading&#xff01;&#xff01;&#xff01;控件名&#xff1a;RingLoading作者&#xff1a;WPFDevelopersOrg原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal框架使用大于等于.NET40&#xff1b;Visua…

如何避免下重复订单

电子交易的一个很基本的问题&#xff0c;就是避免用户下重复订单。用户明明想买一次&#xff0c;结果一看下了两个单。如果没有及时发现&#xff0c;就会带来额外的物流成本和扯皮。对商家的信誉也不好看。 从技术上看&#xff0c;这是一个分布式一致性问题&#xff1b;但实际…

图像分类学习笔记

1.计算机认识图像的方式&#xff1a;都是数字。例如一个 128X128 的3通道的图片 是由 128X128X3个数字 组成的。 2.面临的难点&#xff1a;一幅图可以说明。 3.分类器 A&#xff1a;Nearest Neighbor Classifier&#xff1a;与CNN无关&#xff0c;但是可以帮助我们理解一下分类…

知物由学 | 干货!一文了解安卓APP逆向分析与保护机制

“知物由学”是网易云易盾打造的一个品牌栏目&#xff0c;词语出自汉王充《论衡实知》。人&#xff0c;能力有高下之分&#xff0c;学习才知道事物的道理&#xff0c;而后才有智慧&#xff0c;不去求问就不会知道。“知物由学”希望通过一篇篇技术干货、趋势解读、人物思考和沉…

[转]以终为始,详细分析高考志愿该怎么填

为什么写这篇文章&#xff1f; 之所以写本文&#xff0c;是因为我自己有用处。 我简要介绍&#xff0c;长话短说。我从一个普通的211本科毕业&#xff0c;已经接受社会"毒打"多年&#xff0c;回想起高考填志愿&#xff0c;依然会觉得有些许遗憾。我在贵州省的一个小县…

ASP.NET Core 中的重定向

前言在《如何使用ASP.NET Core Web API实现短链接服务》中&#xff0c;我们使用了Redirect方法返回跳转状态码:[HttpGet("{shortUrl}")] public IActionResult GetUrl(string shortUrl) {var hashids new Hashids("公众号My IO", minHashLength: 6);var i…

客户端应用试用限制设计

1.概要最近接到公司安排的任务给客户端设计一个“试用30天”的一个需求&#xff0c;其功能主要是为了防止客户拿到产品之后不支付尾款继续使用。众所周知靠纯软件想防“盗版”&#xff0c;“限制试用”等做法是行业难题。只要价值足够高一定有人会破解绕过你的所有防线达到免费…

【开发工具之Spring Tool Suite】6、用Spring Tool Suite简化你的开发

如果你是一个喜欢用spring的人&#xff0c;你可能会在欣赏spring的强大功能外&#xff0c;对其各样的配置比较郁闷&#xff0c;尤其是相差较大的版本在配置文件方面会存在差异&#xff0c;当然你可以去花不少的时间去网上查找相关的资料&#xff0c;当你准备使用更高版本spring…

康威定律,作为架构师还不会灵活运用?

Soft skills are always hard than hard skills. 软技能比硬技能难。 老板听说最近流行“微服务”&#xff0c;问架构师咱们的系统要不要来一套&#xff1f;老板又听说最近流行“中台系统”&#xff0c;问架构师咱们要不要搞起来&#xff1f;其实&#xff0c;这些问题不用老板问…

WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)

此案例是《.Net WebView2 项目&#xff0c;实现 嵌入 WEB 页面 Chromium内核》文的续集。主要是针对WebView2的一些微软自己封装的不熟悉的API&#xff0c;有一些人已经对 PuppeteerSharp很熟悉了&#xff0c;那么&#xff0c;直接用 PuppeteerSharp的话&#xff0c;那就降低了…

[转]2022 年 Java 行业分析报告

你好&#xff0c;我是看山。 前段时间介绍了从 Java8 到 Java17 每个版本比较有特点的新特性&#xff08;收录在 从小工到专家的 Java 进阶之旅 专栏&#xff09;&#xff0c;今天看到 JRebel 发布了《2022 年 Java 发展趋势和分析》&#xff0c;于是借此分析一下 Java 行业的现…