C# AOP
我在網上看了一下關于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>的類型進行傳遞,這種設計?真的非常不一般?值得細細品味!
轉載于:https://www.cnblogs.com/ProjectDD/p/10915552.html
總結
- 上一篇: Linux或者Mac解压乱码问题
- 下一篇: C#多线程技术总结(异步)