我在网上看了一下关于AOP的各种介绍,我觉得和我想象的不一样,不可调和啊,我的理解是从拦截来的
,就是管道,管道里面有很多面片,你可以在这些面片里面插入逻辑,这和事件基本是一回事啊,一个过程里面放一些占位方法就ok了
只不过,对于拦截管道来说,他是由很多个切片共同构成的,所以并不是事件那样只是一个命名的契入点占位,这个是其主要区别,而网上那些
介绍说的是什么j8 横截面,举什么j8 日志,和主业务 不相关的,东西需要 放在主业务周围的时候 有很多类都有这样的共同需求的时候就是AOP要解决的问题
完全 是两回事,有些人还用很复杂 的技术 写泥码一弯弯,想看死人啊,什么IL,Attribute,Emit,Remoting,。。。 真泥码h上天了...
所以我愤然写下这篇日志,拒绝那些网上说的AOP概念 其实是豪无卵用的破玩意儿,我们还是就关注,管道和拦截吧
如何才能。。象wcf里,象更高阶更成熟 的.net core中间件那样来玩,切面,管道,才是真要所在啊,这方面我还下不了嘴,不过感觉
学会了会很受用啊
希望知音来和我一起分析 分析 !
我下面贴下 初步模拟aop 模型,
using System; using System.Collections.Generic; using System.Threading.Tasks; namespace myaop{ public class AopModel{ public Action<Pipe> ConfigPipe; Pipe instance; public Context Run(Context ctx){ this.instance=new Pipe(ctx); this.ConfigPipe?.Invoke(this.instance); foreach(var i in this.instance.aspects){ i.Invoke(this.instance.ctx); } return this.instance.ctx; } } public class Pipe{ public List<Aspect> aspects; public Context ctx; public Pipe(Context ctx){ this.ctx=ctx; this.aspects=new List<Aspect>(); } } public class Context{ public int state1; public int state2; public int state3; } public delegate Task Aspect(Context context); }
using System; using System.Threading.Tasks; namespace myaop{ public class Program{ static public void Main(params string[] args){ Console.WriteLine("aop test is start."); var aop=new AopModel(); aop.ConfigPipe=(pipe)=>{ //来个加减乘除 pipe.aspects.Add(ctx=>{return Task.Run(()=>{ ctx.state3=ctx.state1+ctx.state2; });}); pipe.aspects.Add(ctx=>{return Task.Run(()=>{ ctx.state3=ctx.state3-ctx.state2; });}); // pipe.aspects.Add(ctx=>{return Task.Run(()=>{ // ctx.state3=ctx.state3*ctx.state2; // });}); pipe.aspects.Add(ctx=>{return Task.Run(()=>{ ctx.state3=ctx.state3/ctx.state2; });}); }; var resualt=aop.Run(new Context{state1=5,state2=2}); Console.WriteLine(resualt.state3); } } }
在.net core中间件的设计里面,Context 是一个委托,这就更灵活了,而且 处理连通过 一个 Func<Context,Context>的类型进行传递,这种设计 真的非常不一般 值得细细品味!