.NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)

07 | 用Autofac增强容器能力:引入面向切面编程(AOP)的能力

如何获取没有命名的服务呢?

// 获取没有命名的服务,把 namd 去掉即可
var servicenamed = this.AutofacContainer.Resolve<IMyService>();
servicenamed.ShowCode();// Autofac 容器获取实例的方式是一组 Resolve 方法
var service = this.AutofacContainer.ResolveNamed<IMyService>("service2");
service.ShowCode();

启动程序,输出如下:

MyService.ShowCode:61566768
MyServiceV2.ShowCode:44407631,NameService是否为空:True

接下来,讲解属性注入

builder.RegisterType<MyNameService>();
// 只需要在注册方法加上 PropertiesAutowired 即可
builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired();

从服务里面获取它并且 ShowCode

var servicenamed = this.AutofacContainer.Resolve<IMyService>();
servicenamed.ShowCode();

启动程序,输出如下:

MyServiceV2.ShowCode:11318800,NameService是否为空:False

不为空,注册成功

接下来,演示 AOP 场景,它指的是在不期望改变原有类的情况下,在方法执行时嵌入一些逻辑,使得可以在方法执行的切面上任意插入逻辑

namespace DependencyInjectionAutofacDemo.Services
{/// <summary>/// IInterceptor 是 Autofac 的面向切面的最重要的一个接口,它可以把逻辑注入到方法的切面里面去/// </summary>public class MyInterceptor : IInterceptor{public void Intercept(IInvocation invocation){// 方法执行前Console.WriteLine($"Intercept before,Method:{invocation.Method.Name}");// 具体方法的执行,如果这句话不执行,相当于把切面的方法拦截掉,让具体类的方法不执行invocation.Proceed();// 方法执行后,也就是说可以在任意的方法执行后,插入执行逻辑,并且决定原有的方法是否执行Console.WriteLine($"Intercept after,Method:{invocation.Method.Name}");}}
}

如何启动切面?

// 把拦截器注册到容器里面
builder.RegisterType<MyInterceptor>();
// 注册 MyServiceV2,并且允许它属性注册 (PropertiesAutowired)
// 开启拦截器需要使用 InterceptedBy 方法,并且注册类型 MyInterceptor
// 最后还要执行一个开关 EnableInterfaceInterceptors 允许接口拦截器
builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired().InterceptedBy(typeof(MyInterceptor)).EnableInterfaceInterceptors();

拦截器分两种类型,一种是接口拦截器,一种是类拦截器

常用的是接口拦截器,当服务类型是接口的时候,就需要使用这种方式

如果没有基于接口设计类,而是实现类的时候,就需要用类拦截器

类拦截器需要把方法设计为虚方法,这样子允许类重载的情况下,才可以拦截到具体的方法

启动程序,输出如下:

Intercept before,Method:ShowCode
MyServiceV2.ShowCode:31780825,NameService是否为空:True
Intercept after,Method:ShowCode

接下来看一下子容器的用法

// Autofac 具备给子容器进行命名的特性,可以把以服务注入到子容器中,并且是特定命名的子容器,这就意味着在其他的子容器是获取不到这个对象的
builder.RegisterType<MyNameService>().InstancePerMatchingLifetimeScope("myscope");

创建一个 myscope 的子容器

using (var myscope = AutofacContainer.BeginLifetimeScope("myscope"))
{var service0 = myscope.Resolve<MyNameService>();using (var scope = myscope.BeginLifetimeScope()){var service1 = scope.Resolve<MyNameService>();var service2 = scope.Resolve<MyNameService>();Console.WriteLine($"service1=service2:{service1 == service2}");Console.WriteLine($"service1=service0:{service1 == service0}");}
}

启动程序,输出如下:

service1=service2:True
service1=service0:True

这意味着在 myscope 子容器下面,不管再创建任何子容器的生命周期,得到的都是同一个对象

这样子的好处是当不期望这个对象在根容器创建时,又希望它在某一定的范围内时单例模式的情况下,可以使用这种方式

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

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

相关文章

hdfs读写流程_一文读懂HDFS分布式存储框架分析

一文读懂HDFS分布式存储框架分析HDFS是一套基于区块链技术的个人的数据存储系统&#xff0c;利用无处不在的私人PC存储空间及便捷的网络为个人提供数据加密存储服务&#xff0c;将闲置的存储空间利用起来&#xff0c;服务于正处于爆发期的个人数据存储市场。HDFS属于什么结构体…

gRPC in ASP.NET Core 3.x - gRPC 简介(1)

gRPC的结构 在我们搭建gRPC通信系统之前&#xff0c;首先需要知道gRPC的结构组成。 首先&#xff0c;需要一个server&#xff08;服务器&#xff09;&#xff0c;它用来接收和处理请求&#xff0c;然后返回响应。 既然有server&#xff0c;那么肯定有client&#xff08;客户端&…

arcgis 获取json经纬度_干货|ArcGIS的矢量化操作——ArcGis中进行地形图的配准

1.1.1方法简介1.1.1.1所有图件扫描后都必须经过扫描纠正&#xff0c;对扫描后的栅格图进行检查&#xff0c;以确保矢量化工作顺利进行。对影像的配准有很多方法&#xff0c;下面介绍一种常用方法。(1)打开 ArcMap&#xff0c;增加 Georeferncing 工具条。(2)把需要进行纠正的影…

使用ASP.NET Core构建RESTful API的技术指南

译者荐语&#xff1a;利用周末的时间&#xff0c;本人拜读了长沙.NET技术社区翻译的技术文章《微软RESTFul API指南》&#xff0c;打算按照步骤写一个完整的教程&#xff0c;后来无意中看到了这篇文章&#xff0c;与我要写的主题有不少相似之处&#xff0c;特意翻译下来。原文来…

查询ecshop网站代码排查方法_提升网站访问速度,提升网站访问速度,提升网站访问速度的个人经验分享...

一、前言网站打开慢这个问题&#xff0c;算是老生常谈了&#xff0c;在实际的生产的环境中&#xff0c;我们会经常遇到这样的问题。作为一个运维工程师&#xff0c;我们该从哪些角度去分析问题&#xff0c;判断问题&#xff0c;并最终解决问题。那么首先我会从几个方面分析这个…

dotnet 手工打一个 dotnet tool 包

现在依靠 dotnet 平台&#xff0c;可以方便分发工具&#xff0c;利用 NuGet 服务进行分发和使用工具。打一个 dotnet tool 包&#xff0c;可以将这个包上传到 NuGet 上&#xff0c;小伙伴通过和安装 NuGet 相同方式就可以将工具安装在本机上。本文将告诉大家如何手工打一个 dot…

漫谈Linux文档属性、拥有者、群组、权限

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

java foreach跳出本次循环_Java中提供三种常用的循环语句

开发工具与关键技术&#xff1a;MyEclipse 10,java作者&#xff1a;刘东标循环语句&#xff1a;满足一定条件的情况下反复执行一个操作。Java中提供三种常用的循环语句&#xff1a;1.while循环语句while先判断为真&#xff0c;再执行while循环语句&#xff0c;如果条件为假&…

如何学习WPF技术?

本文由长沙DotNET技术社区【邹溪源】整理&#xff0c;共有7544字&#xff0c;阅读需耗时15分钟。引言在桌面开发领域&#xff0c;虽然在某些领域&#xff0c;基于electron的跨平台方案能够为我们带来某些便利&#xff0c;但是由于WPF技术能够更好的运用Direct3D带来的性能提升、…

java爬取网页数据_如何使用爬虫工具采集数据

网络爬虫是一种按照一定规则&#xff0c;自动抓取万维网数据的脚本。按照一定规则&#xff0c;指的是爬虫程序需要解析网页的dom结构&#xff0c;针对dom结构爬取自己感兴趣的数据。(图1)这就是一个网页源码的dom结构,我们需要一级一级指定抓取的标签&#xff0c;如下图:(图2)图…

gRPC in ASP.NET Core 3.x - gRPC 简介(2)

前一篇&#xff1a;gRPC in ASP.NET Core 3.x - gRPC 简介&#xff08;1&#xff09;身份认证这里指的不是用户的身份认证&#xff0c;而是指多个server和client之间&#xff0c;它们如何识别出来谁是谁&#xff0c;并且能安全的进行消息传输。在身份认证这方面&#xff0c;gRP…

.NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记

08 | 配置框架&#xff1a;让服务无缝适应各种环境配置是应用程序发布到各种环境的必备能力&#xff0c;这一节开始详细讲解 ASP.NET Core 的配置框架配置框架的核心包有两个&#xff0c;一个抽象包&#xff0c;一个实现包Microsoft.Extensions.Configuration.AbstractionsMicr…