zoukankan      html  css  js  c++  java
  • .net core 3.1 基于Aspect-Injector实现AOP编程 (一)

    之前学习.NET CORE 接触到切面编程这个概念,比较感兴趣,怎奈工作太忙,没时间研究,这周难得空闲一天,就试了下,在这里分享下。

      1、什么是AOP?

      AOP为Aspect Oriented Programming的缩写,意为:面向切面编程。举个例子,.NET MVC中的filter就是切面编程的一种实现,过滤器就是一个切面,哪里需要就插到哪里,如果不需要就拔掉即可,从而实现可插拔操作。

      2、Aspect-Injector

      Aspect Injector 是一个开源的AOP框架,支持.NET OCRE,这个框架比较轻量级,但是麻雀虽小五脏俱全,它可以满足于大部分AOP场景:

    • 支持.NET Core
    • 支持对异步方法注入切面
    • 能够把切面注入到方法、属性和事件上
    • 支持Attribute的方式注入切面

      3、实现

      首先要引入 Aspect Injector,我用的是VS2019,在NuGet里面,搜索并安装就可以了。

    接下来就是引入命名空间,并进行编码了,在这我写了两个很简单的示例,大家看下。这里说明下,我看了很多教程,里面的写法不尽相同,应该是.NET CORE版本不同对应的Aspect Injector不同,导致写法不同,我这边项目的版本是.NET CORE 3.1 ,然后Aspect Injector版本是2.4.1

     1 using AspectInjector.Broker;
     2 using Newtonsoft.Json;
     3 using System;
     4 using System.Collections.Generic;
     5 using System.Diagnostics;
     6 using System.Text;
     7 
     8 namespace Y.AOP.Service
     9 {
    10     /// </summary>
    11     /// description:基于Aspect-Injector实现AOP,执行前执行后示例
    12     /// version:1.0 
    13     /// author:PrintY  
    14     /// date:2020-08-09  
    15     /// </summary>  
    16     [Aspect(Scope.Global)]
    17     [Injection(typeof(LogAspect))]
    18     public class LogAspect : Attribute
    19     {
    20         /// <summary>
    21         /// 执行前
    22         /// </summary>
    23         /// <param name="name">方法名</param>
    24         /// <param name="arguments">参数</param>
    25         [Advice(Kind.Before)]
    26         public void LogBefore([Argument(Source.Name)] string name, [Argument(Source.Arguments)] object[] arguments)
    27         {
    28             Console.WriteLine("");
    29             Console.WriteLine($"Before,调用方法:'{name}',调用参数:{JsonConvert.SerializeObject(arguments)}");
    30         }
    31 
    32         /// <summary>
    33         /// 执行后
    34         /// </summary>
    35         /// <param name="name">方法名</param>
    36         /// <param name="arguments">参数</param>
    37         /// <param name="retrrnValue">返回值</param>
    38         [Advice(Kind.After)]
    39         public void LogAfter([Argument(Source.Name)] string name, [Argument(Source.Arguments)] object[] arguments, [Argument(Source.ReturnValue)] object retrrnValue)
    40         {
    41             Console.WriteLine("");
    42             Console.WriteLine($"After,调用方法:'{name}',调用参数:{JsonConvert.SerializeObject(arguments)},返回值为:{JsonConvert.SerializeObject(retrrnValue)}");
    43         }
    44     }
    45 }

     使用的话就很简单了,只要是用过 ASP.NET MVC的应该都见过这个用法:

    1 [LogAspect]
    2 public string GetLog(string Msg = "AOP LOG 测试!")
    3 {
    4     return "这是" + Msg;
    5 }

     上面的示例很简单,算是初识Aspect Injector,以后有更深入的了解再做分享。

  • 相关阅读:
    面向对象
    通信编程
    系统编程和单片机编程思维的改变
    代码是设计出来的
    好的代码设计
    通信传输协议数据包的独门绝技使用-----------共用体的使用
    $|^|z||/a|/l
    eubacteria|endosymbiosis|基因转移
    ctDNA|endosymbiosis
    mtDNA|ctDNA|cpDNA|
  • 原文地址:https://www.cnblogs.com/PrintY/p/13466831.html
Copyright © 2011-2022 走看看