• 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>的类型进行传递,这种设计 真的非常不一般 值得细细品味!

  • 相关阅读:
    如何在 Linux 上用 IP转发使内部网络连接到互联网
    python 基础-文件读写'r' 和 'rb'区别
    处理HTTP状态码
    国内可用免费语料库(已经整理过,凡没有标注不可用的链接均可用)
    java读取大文件
    struts.properties的参数描述
    ResourceBundle使用
    linux定时任务的设置
    杂记
    JAVA动态加载JAR包的实现
  • 原文地址:https://www.cnblogs.com/ProjectDD/p/10915552.html
Copyright © 2020-2023  润新知