.net5 AOP思想

.net5 AOP思想

划重点:AOP是一种思想

在.net core 中间件和过滤器都是AOP思想的实现,包括结构性设计模式种的装饰器模式都是实现AOP的方法

那AOP思想到底是啥?

AOP是OOP的延续,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(再通俗一点,就是不动原有业务逻辑的情况之下,在你之前和之后都能干点事情)

静态代理实现(装饰器模式实现AOP)

 public abstract class  IEat
    {
        public abstract void Eatfuc();

    }
 public class Eat : IEat
    {
        public override void Eatfuc()
        {
            Console.WriteLine("准备吃饭!");
        }
        public  void Xishoufuc()
        {
            Console.WriteLine("吃饭之前先洗手!");
        }
    }

比如说吃饭这件事情,定义一个吃饭的方法,但是呢,吃饭前先洗手,oop思想就是这样子的

 Eat eat = new Eat();
eat.Xishoufuc();//先洗手
eat.Eatfuc();//再吃饭

那如果说,我在吸收之前再做很多事情呢,势必,要在Eat 这个类里面加入很方法,然后前台一个一个调用,这样代码是相当的不稳定,而且还违背了设计模式的原则。

装饰器模式
在新建一个类,其实在前面就讲过,结构性设计模式的套路就是新建第三个类来解决问题。

 public class Eatzhuangshiqi : IEat
    {
        private IEat _Eat;
       public Eatzhuangshiqi(IEat Eat)
        {
            _Eat = Eat;
        }
        public override void Eatfuc()
        {
            Console.WriteLine("吃饭之前先洗手!");
            _Eat.Eatfuc();
        }
    }

前台调用

 //装饰器模式实现AOP
                IEat ea = new Eat();
                ea = new Eatzhuangshiqi(ea);
                ea.Eatfuc();

这样呢,前台不动,在有其他行为,我们只要再新建一个类,继续实现

委托实现AOP(在.net core中间件里面其实就是这玩意)

 public abstract class BaseAttribute: Attribute
    {
        public abstract Action fun(Action action, ApplyContext context);
      
    }
 public class InAction
    {
        [InAction1]
        [InAction2]
        public void Eat(ApplyContext context)
        {
            Console.WriteLine("核心方法");
        }
    }


    public class InAction1 : BaseAttribute
    {
       
        public override Action fun(Action action, ApplyContext context)
        {
           
            return new Action(() =>
            {
                {

                    action.Invoke();
                    Console.WriteLine("执行前");
                   
                    
                }
               
                //action.Invoke();
            });
          
        }
    }
    public class InAction2 : BaseAttribute
    {
        public InAction2()
        {

        }
        public override Action fun(Action action, ApplyContext context) {
            return new Action(() =>
            {
                {
                    action.Invoke();
                    Console.WriteLine("执行后");
                   
                }

            });
         
           
            
        }
     
    }
 public  class ActionAop
    {
        public static void Show()
        {
            ApplyContext context = new ApplyContext();
            InAction ia = new InAction();
            //定义一个委托,执行你要的业务逻辑方法(这里就是准备吃饭);
          
            Type type = ia.GetType();//获取类
            MethodInfo methodInfo = type.GetMethod("Eat");
       
            object[] obj = new object[1];
            obj[0] = context;
             Action action = () => { methodInfo.Invoke(ia, obj); };//注意这边只是调用还没有执行方法,等到action.invoke才会真正开始执行

            
            if (methodInfo.IsDefined(typeof(InAction2), true))//遍历寻找特性
            {
                //未来了方便呢,这里农艺一个特性基类,,不然if判断比较多
                foreach (BaseAttribute attribute in methodInfo.GetCustomAttributes(typeof(BaseAttribute), true)) 
                {
                    action = attribute.fun(action, context);
                }
            }
            action.Invoke();
        }
    }

动态代理实现Aop

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盆友你是否很有多问号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值