Asp.net core 中实现AOP面向切面编程

面向切面编程的含义:比面向对象编程更细化,比如在类前边加点东西,在类后边加点东西,先来比较一下主要的集中编程思想。

  1. POP编程:线性思维的方式来编程;
  2. OOP编程:面向对象编程,从对象的角度出发,先考虑有哪些对象,然后考虑对象应该具有的属性和方法,OOP可以应对复杂的业务需求,不管做多复杂的系统,都可以将功能拆分成一个个的类实现;
  3. AOP编程:可以在不破坏类封装的情况下,可以任意的扩展类的功能,可以方便代码复用,可以让程序员更专注于核心业务;

AOP实现的方式:

  • 静态方法:代理模式 & 装饰器模式
  • 动态实现:dynamic proxy
  • 最常用的:Filter(MVC)& IOC容器扩展实现AOP

在这里插入图片描述

4.DDD领域驱动设计:有边界的意识。面向过程没有边界思想,在面向对象的开发环境中,对象就是边界(都装到盒子里,盒子就是边界,方便管理,以盒子为单位进行管理,管理的基础单位就会少一点),在编程的过中,考虑的不是对象,而是domain。在这里插入图片描述在这里插入图片描述
AOP的优点
1.在面向对象的思想中,只能对类为整体进行替换,对类本身没有办法扩展(在不更改类内部代码的前提下)
2.业务逻辑之外的东西,都可以依靠AOP来实现(比如认证和记录日志)

使用静态代理模式实现AOP

使用开发者模式中的代理者模式
1.声明一个接口:

   public interface IDBHelp
    {
        int Save(UserInfo userInfo);//接口是要传参数的;
    }

2.声明实现接口的类:

 public class DBHelp:IDBHelp
    {
        public int Save(UserInfo userInfo)
        {
            Console.WriteLine("数据写入sqlserver数据库");
                return default(int);
        }
    }

3.当想要对IDBhelp类进行扩展的时候(比如前后加上日志输出到控制台)
声明一个代理类(Proxy)

 public class DBHelperProxy : DBHelp    //代理模式
    {
        private IDBHelp _IdbHelper = new MySqlServer();//声明想要代理的类的实例
        private ILogHelp logHelp = new LogConsole();//日志文件的实例
        private void Before()
        {
            logHelp.Log("Prepar Save");
        }
        //IDBHelp类本身自带的方法
        public int Save(UserInfo userInfo)
        {
            this.Before();                      //在前边加个日志;
            var Result= _IdbHelper.Save(userInfo);
            this.After();                       //在后边加个日志
            return Result;
        }

        public void After()  
        {
            logHelp.Log("After Save");
        }
    }

4.对Proxy类进行调用: 令接口 = Proxy

IDBHelp dBHelp1 = new DBHelperProxy();   
                dBHelp1.Save(userInfo1);

装饰器模式和代理模式实现原理基本相同,都是静态方法,此处不再赘述;
动态实现的方法:
有Remoting方法和Emit方法:

  • Remoting中要调用固定的代码
  • Emit使用的比较少

基于AOP Filter来实现

Core WebApi:的几种过滤器:
1.授权过滤器:AuthorizeAttribute.
2.异常过滤器:IExceptionFilter , IAsyncExceptionFilter
3.方法过滤器: ActionfilterAttribute, IActionFilter , IAsyncActionFilter.
后边两种是相对asp.net framwork来讲,asp.net core所特有的
4.资源过滤器:IResourceFilter
5.结果过滤器:ResultFilterAttribute, IResultFilter, IAsyncResultFilter




IResourceFilter的使用方法
将resourcefilter做成attribute后,加到http请求上,注意执行的顺序
1.新建CustomResourceFilterAttribute类

 public class CustomResourceFilterAttribute : Attribute, IResourceFilter //注意必须继承的父类和接口;
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            Console.WriteLine("this is CustomResourceFilterAttribute.OnResourceExecuting ");//HTTP请求函数执行前先执行他
        }
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.WriteLine("this is CustomResourceFilterAttribute.OnResourceExecuted ");///HTTP请求函数执行后再执行他
        }
    }

2.将特性加到要调用的Http请求上:

  public class FilterController : ControllerBase
    { 
        public FilterController()
        {
            Console.WriteLine("当前的这个 FilterController 被构造");
        }
        [Route("GET")]
        [HttpGet]
        [CustomResourceFilter]
       
        public string Get()
        {
            Console.WriteLine("get方法了");
            return "this is zhao-001";
        }
    }

观察控制台上的执行顺序。比构造函数执行还要早
在这里插入图片描述

正式因为IResoultFilter的这个特性,所以用来做缓存:
3.在IResoultFliter类类里面,具体代码实现如下:

  public class CustomResourceFilterAttribute : Attribute, IResourceFilter //注意继承的父类和接口;
    {
        private static Dictionary<string, object> dictionaryCache = new Dictionary<string, object>();//声明一个字典类型
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            string key = context.HttpContext.Request.Path.ToString();
            //读取缓存发生在这里:
            if (dictionaryCache.ContainsKey(key))
            {
                context.Result = dictionaryCache[key] as ObjectResult;//Result短路器
            }
            Console.WriteLine("this is CustomResourceFilterAttribute.OnResourceExecuting ");
        }
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            //缓存的存储发生在这
            string key = context.HttpContext.Request.Path.ToString();
            Console.WriteLine($"key的值是{key}");//请求的路由地址;
            ObjectResult objectResult = context.Result as ObjectResult;
            dictionaryCache[key] = objectResult;
            Console.WriteLine("this is CustomResourceFilterAttribute.OnResourceExecuted ");
        }
    }

注意: context.result=…这段代码俗称Result断路器,意思是遇到这段代码,就直接返回结果,程序不往下走了;
4.运行程序,刷新界面,发现时间不变,说明已经使用了缓存。

在这里插入图片描述

IActionFilterAttribute的使用方法:

运行结果,观察他的执行顺序:
在这里插入图片描述
参考文献
侵权联系删除

沧海一声笑·rush
关注 关注
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于asp.net core里面实现AOP的方法
yeqifeng2288的博客
03-04 3854
好像很人有提及这个,刚好今天看到 比起mvc5 asp.net coreAOP实现真是超级简单。 1.首先创建一个类继承自ActionFilterAttribute ,这个特性里有6个方法可以被重写,一下是标记 public class DoSomething:ActionFilterAttribute { private readonly ILogger _logger...
在.NET Core三种实现“可插拔”AOP编程方式(附源码)
linnek的专栏
03-15 1320
一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点。 本文讨论另外三种在netcore实现的方式,Filter(过滤器,严格意义上它算是AOP方式),DynamicProxy(动态代理方式,JAVA上早已不是新鲜事),Middleware(netcore间件所实现AOP方式) 什么是AOP编程 在软件业,AOPAspect Oriented P...
ASP.NET CORE 第五篇 AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
雨中深巷的油纸伞
12-28 2090
原文作者:老张的哲学 零、今天完成的深红色部分 image.png 一、AOP实现日志记录(服务层) 首先想一想,如果有一个需求(这个只是我的一个想法,真实工作可能用不上),要记录整个项目的接口和调用情况,当然如果只是控制器的话,还是挺简单的,直接用一个过滤器或者一个间件,还记得咱们开发Swagger拦截权限验证的间件么,那个就很方便的把用户调用接口的名称记录下来,当然也可...
[译]如何在ASP.NET Core实现面向切面编程(AOP)
Lamond Lu的博客
09-07 522
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Core实现面向切面编程(AOP) 译文作者:Lamond Lu 前言 在使用了Spring Boot数月之后,  我发觉ASP.NET Core缺失了对面向切面编程(AOP)的默认支持。 维基百科针对AOP的定义: 面向切面编程(AOP)是一种编程范例,其旨在通过允许跨领域关注点的分离来提高模块化。它.
ASP.NET Core过滤器之TypeFilterAttribute和IAsyncActionFilter
最新发布
.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造
04-04 354
TypeFilterAttribute 在 ASP.NET Core 是一个用于指定过滤器工厂类型的特性,它允许你通过类型的方式应用过滤器,并可能传递参数给过滤器的构造函数。​​​​​​​在这个例子,TypeFilterAttribute 告诉 ASP.NET Core 使用 CustomAsyncActionFilter 类型作为过滤器。​​​​​​​在这个例子,someValue 会作为构造函数的第一个参数传递给 CustomAsyncActionFilter。,能助你升职+涨薪!
NETCore 实现AOP
qq_32379229的博客
04-23 1422
1:静态方式(装饰模式或者代理模式) Model: public class User { public string Name { get; set; } public int Age { get; set; } } IUserservice: public interface IUserService { bool AddUser(User user); } //[Intercept(typeof(Au
asp.net core AOP 面向切面编程 ExceptionFilter
q8812345qaz的博客
10-04 286
使用方法 1. 创建 MyException.cs 继承 IAsyncExceptionFilter 实现 OnExceptionAsync 方法。ExceptionFilter 是 在不修改源代码 的情况 下 给 asp.net core 程序 添加 异常捕获 并自定义处理异常。面向切面编程,也叫做面向方法编程,是通过预编译方式和运行期动态代理的方式实现不修改源代码的情况下给程序动态统一添加功能的技术。然后在 Program.cs 文件 添加注册。下面为 MyException.cs 示例。
C#/.Net企业级系统架构设计实战精讲教程
12-03
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术的2种来减少层与层之间的依赖等。6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客,请把作业链接贴在评论区,老师会定期逐个批改~~)
Spring AOP面向切面编程实现原理方法详解
08-18
面向切面编程AOP)是Spring框架的一个重要内容,通过预编译方式和运行期动态代理实现,在不修改源代码的情况下,给程序动态统一添加功能的一种技术。AOP可以对业务逻辑的各个部分进行隔离,使业务逻辑各部分之间...
Java实现AOP面向切面编程的实例教程共4页.pdf.z
10-30
Java实现AOP面向切面编程的实例教程共4页.pdf.zip
.net AOP 面向切面编程很好的例子
11-11
spect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程切面进行提取,它所面对的是处理过程的某个步骤或阶段,以获得逻辑过程各部分之间低耦合性的...
Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能
01-19
最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理。给一个方法加一个缓存特性,那这个方法就会进行缓存。 这个也是网上说的面向切面编程AOPAOP的概念也很好理解,跟间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存、日志等处理。 在net core2.2时,我当时就尝试过用autofac实现aop,但这次我不想用autofac,我用了一个更轻量级的框架,AspectCore。 用起来非常非常的简单,但一开始还是走了一点弯路,主要是网上都是net core3以下的教程,3以下的使用方法跟之前有一些不同。
.NET平台下的依赖注入(IOC)和 面向切面AOP)相结合简洁实用的使用方式
02-20
近日, 学习.NET平台下的依赖注入(IOC)和 面向切面AOP)。 力求获得一种简洁实用的方法实现IOC和AOP相结合的使用方式。 查阅了多个技术资料。经过多次测试,基本达到目的。 IOC使用微软的 Microsoft.Practices.Unity,AOP 使用微软企业库的 Microsoft.Practices.EnterpriseLibrary.PolicyInjection实现
MVC AOP面向切面编程简单介绍及实例
08-31
面向切面编程AOPAspect Oriented Programming)是一种编程范式,旨在提供更好的模块化和组织代码的方式,尤其在处理系统横切关注点时。MVC(Model-View-Controller)架构模式则是一种用于构建Web应用程序的...
Java实现AOP面向切面编程的实例教程
09-02
在Java实现面向切面编程AOP)的实例教程主要关注的是如何在不依赖Spring框架的情况下,利用Java的核心特性来实现AOP的功能。AOP的核心思想是将系统的横切关注点,如日志记录、事务管理、权限检查等,从业务...
推荐最新的Asp.Net Core 下开源的AOP框架 AspectCore
飞鹰的专栏
10-10 9181
AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) 解决方案,它更好的遵循Asp.Net Core的模块化开发理念,使用AspectCore可以更容易构建低耦合、易扩展的Web应用程序。
ASP.NET Core使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
weixin_34235105的博客
01-18 497
前言 本文主要是详解一下在ASP.NET Core,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ASP.NET Core使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ASP.NET Core使用IOC三部曲(二....
SpringBoot实现AOP面向切面编程 具体方法
08-24
Spring Boot实现AOP面向切面编程的具体方法如下: 1. 首先,你需要在项目的pom.xml文件添加spring-boot-starter-aop依赖。可以参考以下代码: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 然后,你需要编写一个用于拦截的bean。这个bean将包含你想要在目标方法执行前后执行的逻辑。你可以使用注解或者编程方式来定义切面。例如,你可以使用@Aspect注解来定义一个切面,然后在切面的方法上使用@Before、@After等注解来定义具体的拦截行为。 3. 接下来,你需要将切面应用到目标对象上,创建代理对象。这个过程称为织入(Weaving)。在Spring Boot,你可以使用@EnableAspectJAutoProxy注解来启用自动代理,它会根据切面定义自动创建代理对象。 总而言之,Spring Boot实现AOP面向切面编程的具体方法包括:添加依赖、编写用于拦截的bean,以及启用自动代理。这样就能实现在目标方法执行前后执行特定逻辑的效果了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot整合aop面向切面编程过程解析](https://download.csdn.net/download/weixin_38689551/12743012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot实现AOP面向切面编程](https://blog.csdn.net/weixin_52536274/article/details/130375560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • keras中的 concatenate() 详解 15152
  • E-R图 9046
  • 在Google浏览器下载网页视频 8116
  • 绘制 混淆矩阵 7300
  • 使用vs2019写vue 6474

分类专栏

  • .net core 22篇
  • 408 4篇
  • 算法 1篇
  • Go 18篇
  • Linux & docker 6篇
  • 数据库 14篇
  • 前端 32篇
  • 代码工具 17篇
  • c# 15篇
  • 计算机视觉 5篇
  • 深度学习 12篇
  • 问题 1篇

最新评论

  • 在Google浏览器下载网页视频

    lingaolei123: open in new tap在哪里呢,没找到呢,还有那个进度条很快也没找到呢

  • Go 入门 の 并发

    沧海一声笑·rush: 原来如此,当时没注意表情包

  • Vue实现复制excel表格内容粘贴至网页

    沧海一声笑·rush: 上面展示需要的传参,如果不需要,可以忽略的。

  • Go 入门 の 并发

    henry_oulen: 那个有bug那个代码这样改一下就好了,你那边没有关闭chan,用完以后需要进行关闭 [code=go] package main import ( "fmt" "sync" ) /* 启动一个 goroutine ,生成100 个数,发送到 ch1 启动一个 goroutien,从ch1 中取值,计算其平方,然后放到 ch2 中 在 main 中,从 ch2 中取值 */ var wg sync.WaitGroup var a chan int var b chan int func f1(ch1 chan int) { defer wg.Done() for i := 0; i < 100; i++ { ch1 <- i } close(ch1) } func f2(ch1, ch2 chan int) { defer wg.Done() for x := range ch1 { ch2 <- x * x } close(ch2) } func main() { a = make(chan int, 100) b = make(chan int, 100) wg.Add(2) go f1(a) go f2(a, b) wg.Wait() for ret := range b { fmt.Println(ret) } } [/code]

  • 基于语音的情绪识别系统(Python)

    weixin_50642148: 请问你实现了吗

大家在看

  • vue基础 679
  • Java毕业设计-基于Vue的前后端分离的企业文档管理系统设计实现
  • ShardingSphere5
  • 【C++】继承
  • python爬虫之QQ空间登录

最新文章

  • dotnet 3.1 + vue 实现图片上传功能
  • go 高阶 の GC垃圾回收机制
  • Go高阶 の 协程调度器原理
2021年67篇
2020年83篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司龙岗关键词按天计费大浪网站优化推广坪山外贸网站建设坪地网站优化按天收费沙井网站关键词优化福田建网站爱联网站推广工具民治百度seo石岩企业网站设计深圳设计网站永湖网络推广横岗至尊标王龙华关键词排名包年推广布吉设计网站松岗网站优化吉祥网站推广大芬网站推广系统双龙网络广告推广大鹏网站定制西乡企业网站制作坑梓网页制作盐田网络营销福田推广网站荷坳百度网站优化排名大浪网站优化软件龙华百度seo南澳网站seo优化布吉百度竞价坪山关键词按天计费丹竹头优秀网站设计歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化