Asp.net core Autofac 案例 注入、AOP 启用接口代理拦截 启用 类代理拦截=== 只会拦截虚方法

资料
在这里插入图片描述

core 实现autofac

》》》 安装 如下工具包
在这里插入图片描述

安装之后 如出现 这种
在这里插入图片描述

》》》编写 AOP类

using Castle.DynamicProxy;
using System.Diagnostics;namespace Web01.AOP
{/// <summary>/// 日志记录/// </summary>public class LoggingInterceptor : IInterceptor{public void Intercept(IInvocation invocation){//被调用的方法名var methodName = invocation.Method.Name;//被调方法所属的类名var className = invocation.TargetType.Name;//被调用方法的参数列表var arguments = string.Join(", ", invocation.Arguments);Console.WriteLine($"方法执行之前:{className}-{methodName}-{arguments}");var stopwatch = Stopwatch.StartNew();try{//执行原始方法的逻辑 就是被调用的方法invocation.Proceed();}catch (Exception ex){//输出方法执行完成的日志信息和执行时间Console.WriteLine($"方法执行异常: {className}.{methodName}");Console.WriteLine($"异常信息: {ex}");throw;}finally{stopwatch.Stop();Console.WriteLine($"方法执行之后: {className}.{methodName}");Console.WriteLine($"方法执行时间:{stopwatch.ElapsedMilliseconds} ms");}}}
}
using Castle.DynamicProxy;
using System.Diagnostics;namespace Web01.AOP
{/// <summary>/// 事务管理拦截器/// </summary>public class TransactionInterceptor : IInterceptor{public void Intercept(IInvocation invocation){var methodName = invocation.Method.Name;var arguments = string.Join(", ", invocation.Arguments);var className = invocation.TargetType.Name;Console.WriteLine($"Before exectiong method [方法执行之前]:{className}-{methodName}-{arguments}");var stopwatch= Stopwatch.StartNew();try{invocation.Proceed();}catch (Exception ex){stopwatch.Stop();Console.WriteLine($"After executing method[ 方法执行之后]:{className}-{methodName}");Console.WriteLine($"Execution time[方法执行的时间]:{stopwatch.ElapsedMilliseconds} ms");throw;}}}
}

在这里插入图片描述
》》》接口 添加拦截器
[Intercept(typeof(拦截器))] 修饰接口,则实现接口的所有类 都会拦截,除非打标签【特性】
[Intercept(typeof(拦截器))] 修饰接口实现的类,则只有此类的方法会拦截。

在这里插入图片描述

在这里插入图片描述


namespace Web01.Comm
{public class MyAresServices : IAresServices{public void Print(){Console.WriteLine( $"MyAresServices--Print 触发" ); ;}public void Print(string name, int age){Console.WriteLine($"MyAresServices--Print 参数为:姓名:{name}--年龄:{age}"); ;}}
}
using Autofac;
using Autofac.Extras.DynamicProxy;
using Web01.AOP;namespace Web01.Comm
{/// <summary>/// Moudle 是Autofac命名空间下面的 /// </summary>public class AutofacMoudleManager:Module{/// <summary>/// 重写Autofac管道Load 方法,load方法里面是注册注入的/// </summary>/// <param name="builder"></param>protected override void Load(ContainerBuilder builder){#region   注册 AOP//注册日志记录拦截器builder.RegisterType<LoggingInterceptor>();//注册性能拦截器builder.RegisterType<PerformanceInterceptor>();//注册事务管理器拦截器builder.RegisterType<TransactionInterceptor>();#endregion//builder.RegisterType<MyAresServices>().As<IAresServices>();builder.RegisterType<MyZenServices>().As<IZenServices>().InstancePerDependency().EnableInterfaceInterceptors(); builder.RegisterType<MyAresServices>().As<IAresServices>().InstancePerDependency().EnableInterfaceInterceptors(); //    .EnableInterfaceInterceptors() //     .AsImplementedInterfaces()//    .InstancePerLifetimeScope()//    .EnableInterfaceInterceptors()//    .InterceptedBy(typeof(LoggingInterceptor), typeof(PerformanceInterceptor), typeof(TransactionInterceptor));;//builder.RegisterType<MyZenServices>().As<IZenServices>();//通.InterceptedBy(typeof(LoggingInterceptor), typeof(PerformanceInterceptor), typeof(TransactionInterceptor));过反射机制实现批量注册服务和拦截器//builder.RegisterAssemblyTypes(Assembly.Load("Web01"))//    .Where(a => a.Name.EndsWith("Services"))//    .AsImplementedInterfaces()//    .InstancePerLifetimeScope()//    .EnableInterfaceInterceptors()//    .InterceptedBy(typeof(LoggingInterceptor), typeof(PerformanceInterceptor), typeof(TransactionInterceptor));//.AsImplementedInterfaces():注册的服务的生命周期是默认的 Transient 生命周期//.InstancePerLifetimeScope():每个请求(即每个 HTTP 请求)创建一个实例,并在整个请求期间重用//.SingleInstance():在整个应用程序生命周期中只创建一个实例,并在每次解析时重用//.InstancePerDependency():每次解析时都创建一个新的实例//builder.RegisterAssemblyTypes(Assembly.Load("xxxxx"))//    .Where(a => a.Name.EndsWith("Services"))//    .AsImplementedInterfaces()//    .SingleInstance();base.Load(builder);}}
}

在这里插入图片描述

 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer<ContainerBuilder>(containerBuilder =>{containerBuilder.RegisterModule<AutofacMoudleManager>();});

在这里插入图片描述

忽略拦截

声明一个 特性 ,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 if (invocation.Method.IsDefined(typeof(NeverInterceptAttribute), true)){Console.WriteLine("=======没有被拦截==========");invocation.Proceed();return;}

源码

接口代理 类代理

在这里插入图片描述

using Autofac;
using Autofac.Extras.DynamicProxy;
using WebApplication2.AOP;namespace WebApplication2.Coms
{public class AutofacMoudleManager:Module{/// <summary>/// 重写Autofac管道Load 方法,load方法里面是注册注入的/// </summary>/// <param name="builder"></param>protected override void Load(ContainerBuilder builder){#region 注册 AOP  把拦截器注册到 autofac 容器中//注册日志记录拦截器//builder.RegisterType<LoggingInterceptor>();// 命名注入//builder.Register<LoggingInterceptor>(c => new LoggingInterceptor()).Named<IInterceptor>("log-record");// 类型注入//builder.Register<LoggingInterceptor>(c=>new LoggingInterceptor());builder.RegisterType<LoggingInterceptor>();//builder.RegisterType(typeof(LoggingInterceptor));//注册性能拦截器builder.RegisterType<PerformanceInterceptor>();//注册事务管理器拦截器builder.RegisterType<TransactionInterceptor>();#endregion#region 注册服务           builder.RegisterType<MyZenServices>().As<IZenServices>();// EnableInterfaceInterceptors方法会动态创建一个接口代理// EnableClassInterceptors方法会创建一个目标类的子类代理类,这里需要注意的是只会拦截虚方法,重写方法//-InstancePerLifetimeScope  每个请求(即每个 HTTP 请求)创建一个实例,并在整个请求期间重用//.AsImplementedInterfaces():注册的服务的生命周期是默认的 Transient 生命周期//.SingleInstance():在整个应用程序生命周期中只创建一个实例,并在每次解析时重用//.InstancePerDependency():每次解析时都创建一个新的实例// 命名注册//builder.RegisterType<MyAresServices>().Named<IAresServices>(typeof(MyAresServices).Name).EnableClassInterceptors();//=================启用接口代理拦截==================== //方式一:需要在接口、实现的类   添加特性   [Intercept(typeof(xxx拦截器))] ///比如   [Intercept(typeof(LoggingInterceptor))]/// 接口加 Intercept 特性,实现接口的类  全部生效/// 实现类 加  Intercept 特性   ,只有此类  生效//builder.RegisterType<MyAresServices>().As<IAresServices>()          // .EnableInterfaceInterceptors();// //方式二:在 注册服务 类型到容器的时候动态注入拦截器(去掉接口、实现的类型上的特性 Intercept)  不要添加特性Intercept// InterceptedBy  支持多个拦截器builder.RegisterType<MyAresServices>().As<IAresServices>().InterceptedBy(typeof(LoggingInterceptor), typeof(PerformanceInterceptor)).EnableInterfaceInterceptors();//================= 启用 类代理拦截===  只会拦截虚方法==================//  方式一   添加特性   [Intercept(typeof(xxx拦截器))] //builder.RegisterType<Student>().EnableClassInterceptors();//  方式二  不需要添加  特性Intercept  builder.RegisterType<Student>().InterceptedBy(typeof(LoggingInterceptor)).EnableClassInterceptors();#endregion//   程序集注册//builder.RegisterAssemblyTypes(Assembly.Load("Web01"))//    .Where(a => a.Name.EndsWith("Services"))//    .AsImplementedInterfaces()//    .InstancePerLifetimeScope()//    .EnableInterfaceInterceptors()//    .InterceptedBy(typeof(LoggingInterceptor), typeof(PerformanceInterceptor), typeof(TransactionInterceptor));base.Load(builder);}}
}
Autofac 三种生命周期 InstancePerLifetimeScope、SingleInstance、InstancePerDependency
 builder.RegisterType<MyZenServices>().As<IZenServices>()//.EnableInterfaceInterceptors方法会动态创建一个接口代理// .EnableClassInterceptors方法会创建一个目标类的子类代理类,这里需要注意的是只会拦截虚方法,重写方法//-InstancePerLifetimeScope  每个请求(即每个 HTTP 请求)创建一个实例,并在整个请求期间重用//.AsImplementedInterfaces():注册的服务的生命周期是默认的 Transient 生命周期//.SingleInstance():在整个应用程序生命周期中只创建一个实例,并在每次解析时重用//.InstancePerDependency():每次解析时都创建一个新的实例

InstancePerLifetimeScope:
同一个Lifetime生成的对象是同一个实例 (每个请求(即每个 HTTP 请求)创建一个实例,并在整个请求期间重用)

SingleInstance:
单例模式,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;
在整个应用程序生命周期中只创建一个实例,并在每次解析时重用

InstancePerDependency:
默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象
每次解析时都创建一个新的实例

AsImplementedInterfaces()

在这里插入图片描述
在这里插入图片描述

AsImplementedInterfaces() 是以接口方式进行注入,注入这些类的所有的公共接口作为服务(除了释放资源)
AsImplementedInterfaces注册的服务的生命周期是默认的 Transient 生命周期

builder.RegisterType().AsImplementedInterfaces(); 使用时用IA,会返回一个A的实例,即将自身的实例进行注入

在这里插入图片描述

  1.  builder.RegisterType<MyZenServices>().As<IZenServices>();   				   接受  用  IZenServices2.  builder.RegisterType<MyZenServices>();                                   					   接受  用  MyZenServices3.  builder.RegisterType<MyZenServices>().AsImplementedInterfaces();			接受  用  IZenServices

builder.RegisterAssemblyTypes 注册程序集中符合条件的类型

Assembly assembly = Assembly.Load(assemblyName);//Assembly assembly = this.GetType().GetTypeInfo().Assembly;builder.RegisterAssemblyTypes(assembly).Where(type => !type.IsInterface && !type.IsSealed && !type.IsAbstract && type.Name.EndsWith("BLL", StringComparison.OrdinalIgnoreCase)).AsImplementedInterfaces().InstancePerLifetimeScope().EnableInterfaceInterceptors().InterceptedBy(typeof(LogInterceptor));
IInterceptorSelector

》》》没有没有 InterceptedBy 则需要加特性,但InterceptedBy 如果太多不利于管理,所以 IInterceptorSelector
在这里插入图片描述

public class ZenLogg : IInterceptorSelector
{/// <summary>/// 让我们选择使用那个IInterceptor/// </summary>/// <param name="type"></param>/// <param name="method"></param>/// <param name="interceptors"></param>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>public IInterceptor[] SelectInterceptors(Type type, MethodInfo method, IInterceptor[] interceptors){return new IInterceptor[] {new LoggingInterceptor(),new PerformanceInterceptor(),new TransactionInterceptor()};}
}
 //支持AAOP扩展--接口扩展builder.RegisterType<MyAresServices>().As<IAresServices>().EnableInterfaceInterceptors(new ProxyGenerationOptions(){Selector = new ZenLogg()});

在这里插入图片描述

AOP 实现缓存

》》》简易化

 public class CusotmCacheInterceptor : IInterceptor{/// <summary>/// 定义构造函数/// </summary>private readonly ILogger<CusotmCacheInterceptor> _ILogger;/// <summary>/// 初始化构造函数/// </summary>/// <param name="logger"></param>public CusotmCacheInterceptor(ILogger<CusotmCacheInterceptor> logger){this._ILogger = logger;}//定义字典private static Dictionary<string, object> _cacheDictionary = new Dictionary<string, object>();/// <summary>/// 切入者逻辑/// </summary>/// <param name="invocation"></param>public void Intercept(IInvocation invocation){//方法之前检查缓存的结果//定义Keystring cacheKey = invocation.Method.Name;//判断当前是否有缓存结果if (_cacheDictionary.ContainsKey(cacheKey)){invocation.ReturnValue = _cacheDictionary[cacheKey];}else{//执行真实的方法invocation.Proceed();//方法之后保存缓存的结果_cacheDictionary[cacheKey] = invocation.ReturnValue;}}

资料

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

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

相关文章

网络安全事件管理

一、背景 信息化技术的迅速发展已经极大地改变了人们的生活&#xff0c;网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题&#xff0c;构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。 国内外的安全事件在不断增…

详谈面试题:Vue、React为什么使用虚拟DOM

虚拟DOM是一种在前端框架中广泛使用的技术&#xff0c;它可以提升开发效率。那么国外流行的框架svelte没有使用虚拟DOM&#xff0c;而是直接操作真实DOM&#xff0c;效率依然很高。为什么Vue和React不采用这种方式呢&#xff1f; 目录 一、框架设计 二、解耦运行环境 三、总…

前端JavaScript(一)---基本介绍

Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;比如Perl&#xff0c;遗留的速度问题&#xff0c;为客户提供更流畅的浏览效果。当时服务端需要对…

(免费送源码)计算机毕业设计原创定制:Java+B/S+SSM+Web前端开发技术+IDEA+MySQL+Navicat 有风小院

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对有风小院等问题&#xff0c;对有风小院信息…

Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新

随着全球AI领域的竞争加剧,越来越多的科技巨头和创新企业纷纷致力于多模态AI的开发。2024年10月14日至18日,GITEX GLOBAL海湾信息技术博览会在迪拜举行,吸引了超过6700家全球科技巨头和创新公司参与,展示了智能互联、人工智能等领域的新成果。 此次展会中,Soul App创始人张璐团…

新版布谷直播软件源码开发搭建功能更新明细

即将步入2025年也就是山东布谷科技专注直播系统开发,直播软件源码出售开发搭建等业务第9年,山东布谷科技不断更新直播软件功能&#xff0c;以适应当前新市场环境下的新要求。山东布谷科技始终秉承初心&#xff0c;做一款符合广大客户需求的直播系统软件。支持广大客户提交更多个…

Dockerfile打包部署

Dockerfile打包 先找到打包完的目录下创建一个Dockerfile文件 touch Dockerfile 进去文件内编写 vim Dockerfile # 基础镜像 FROM openjdk:8 # author MAINTAINER yxh # 挂载目录 VOLUME /home/project # 创建目录 RUN mkdir -p /home/project # 指定路径 WORKDIR /home/pr…

c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备&#xff0c;广泛应用于电子报警器、玩具、计时器等领域。在本项目中&#xff0c;我们结合树莓派Pico开发板&#xff0c;通过C代码控制有源蜂鸣器发出“滴滴”声&#xff0c;并解析其中涉及的关键技术点和硬件知识。 一、项目概述 1. 项…

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化?

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化&#xff1f; 重要性&#xff1a;★★ NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&am…

路由引入中次优路由和路由环路问题

A公司用的是IS-IS&#xff0c;B公司用的是OSPF&#xff0c;现在这两个公司要合并&#xff0c;网络要相通 项目目标 前期准备 配置IP地址&#xff1a;完成IP地址规划&#xff0c;A公司和B公司内部网络通过路由器R2和R4环回接口模拟。配置路由器接口的IP地址并测试所有直连链路的…

shell脚本基础学习_总结篇(完结)

细致观看可以&#xff0c;访问shell脚本学习专栏&#xff0c;对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. S…

光伏功率预测!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型时序预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量时序光伏功率预测 (Matlab2023b 多输入单输出) 1.程序已经调试好&#xff0c;替换数据集后&#xff0c;仅运行一个main即可运行&#xff0c;数据格式…

Postman定义公共函数

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman定义公共函数 在postman中&#xff0c;如下面的代码&#xff1a; 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[…

SpringAI:Java 开发的智能新利器

一、SpringAI 简介 随着人工智能技术的飞速发展&#xff0c;越来越多的开发者开始探索如何将 AI 能力集成到现有的应用中来提升产品的智能化水平。Spring AI 正是为 Java 开发者提供的一款强大的 AI 框架&#xff0c;使得这一集成过程变得前所未有的简单和高效。 本文将深入探…

javaweb-day02-JS(javascript)

1.JavaScript引入 &#xff08;1&#xff09;引入方式 2.JS语法 2.1 书写语法 2.2 变量 &#xff08;1&#xff09;var关键字定义的是全局变量&#xff1b; &#xff08;2&#xff09;可以重复声明&#xff1b; 2.3 数据类型&运算符 &#xff08;1&#xff09;数据类型…

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…

Python语法基础(三)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们这篇文章来说一下函数的返回值和匿名函数 函数的返回值 我们先来看下面的这一段函数的定义代码 # 1、返回值的意义 def func1():print(111111111------start)num166print…

导入100道注会cpa题的方法,导入试题,自己刷题

一、问题描述 复习备考的小伙伴们&#xff0c;往往希望能够利用零碎的时间和手上的试题&#xff0c;来复习和备考 用一个能够导入自己试题的刷题工具&#xff0c;既能加强练习又能利用好零碎时间&#xff0c;是一个不错的解决方案 目前市面上刷题工具存下这些问题 1、要收费…

使用flink编写WordCount

1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 流程图&#xff1a; DataStream API开发 //nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/datastream/overview/ 添加依赖 <properties>&l…