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