热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

.NETCore中AOP的三种实现方式

AOP在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OO

AOP

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点。

总结一下:AOP能在不破坏封装的前提下,去额外扩展程序的功能。



  1. 聚焦业务,轻松扩展功能



  2. 代码复用,集中管理




面向环形编程

结合.net core的编程模型,其实也可以叫面向环形编程

 

 

 

每一环都可以看作是一个中间件,他们之间可以调整顺序,当然除了一些特定的中间件,顺序换了就达不到效果了,一层套一层,并且过滤器也有着同样的模型。


.NET Core 实现AOP的几种方式



  1. Filter方式:MVC流程部分,流程外处理不了



  2. 中间件方式:任何请求最外层到达,提前做些筛选过滤工作。但是中间件没有控制器



  3. 第三方容器(Autofac)::可以深入到业务逻辑层做AOP扩展



这三种方式各有不同,可以用在不同的地方,下面来简单剖析下,其实前面都介绍过了。


1. Filter

.net core自带五种过滤器,分别是验证、资源、动作、异常捕获、结果。



  1. Authorization Filter:身份验证



  2. Resource Filter:发生在控制器实例化之前



  3. Action Filter:发生Action在之前



  4. Exception Filter:捕获异常



  5. Result Filter:发生在视图替换环节



通常我们在这些场景下如身份验证、日志记录、异常获取等会使用到过滤器/



  • 过滤器生命周期





  • 注册方式:





  1. 控制器注册



  2. Action注册



  3. 全局注册





  • 如何使用参数的过滤器



因为特性是编译时确定的,构造函数只能传递常量,所以不能直接传递实例,以下是如何使用带参数的过滤器方法,2,3,4本质是一样的,都是实现了IFilterFactory。



  1. 全局注册



  2. ServiceFilter(注入下过滤器)



  3. TypeFilter(不需要注册)



  4. IFilterFactory可自定义扩展



PS:过滤器是基于MVC框架的,所以404是进不了MVC流程,抓不到异常,所以程序在组织中间件的时候,会把404返回加进去。==


2. 中间件

 


3. Autofac拦截器

 


应用场景


防盗链

中间件:我们可以在中间件中加入判断,如果不是本地网站访问静态的文件,返回一个404等,不让第三方文件盗用我的图片链接等,和下面的白名单类似的。


黑白名单

中间件:通过IP判断是否授权,简单demo

 

缓存

几种方式都可以做,只不过原理不一样,有的是把缓存存在本地服务器,有的是存在客户端,看需求选用。



  • 客户端缓存



本质是在http请求头部加上["Cache-Control"]="public,max-age=60"



  • 服务端缓存:





  1. Filter 资源缓存,只能作用于Action层。



  2. Autofac AOP缓存,可以深入到业务逻辑层,可以利用本地缓存,分布式缓存等。



  3. ResponseCaching:需要安装Microsoft.AspNetCore.ResponseCaching



 

表现出来的结果是:



  1. 第一次刷新的时候,会进入中间件,然后进入Action,返回结果,Fiddler记录到了这一次的请求



  2. 第二次打开新标签页,直接从浏览器缓存中返回的结果,即没有进入中间件,也没有进入Action,Fiddler也没有记录到相关请求



  3. 第三次换了一个浏览器,会进入中间件,直接由缓存返回结果,并没有进入Action,此时Fiddler也将该请求记录了下来,响应头包含了Age





  • 静态文件缓存 对于静态文件,.NET Core有一个单独的StaticFiles中间件,如果想要对它做一些处理,同样需要在管道中进行注册。



合理的利用缓存机制可以有效地降低服务端负载,在微服务应用中尤为重要。

 


鸣谢:

https://www.modb.pro/db/107291

本文来自博客园,作者:{春光牛牛,yak},转载请注明原文链接:https://www.cnblogs.com/yakniu/p/16350156.html

欢迎各位大佬们评论指正

QQ讨论群:610129902.NET Core架构师




在这里插入图片描述



推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
author-avatar
柠檬泪滴味道186
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有