asp.net core的AOP记录

Posted dengbo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net core的AOP记录相关的知识,希望对你有一定的参考价值。

序曲:学习编程最好的方式就是敲代码,没有比这个更好的方法,哪怕你看了上百G的视频,都不如你自己敲几行代码更为有效。还有要记得敲完代码然后写一篇随笔来记录一下你所学所想。

什么叫AOP?

AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

运用场景?

比较常见的场景是:日志记录,错误捕获、性能监控等 AOP的本质是通过代理对象来间接执行真实对象,在代理类中往往会添加装饰一些额外的业务代码。

 

下面通过代码来说明一下,本文举例比较简单的案例来说明,若有错误,多谢指点。

建立一个asp.net core的控制台程序来演示

利用Nuget引入相关的包文件

如图所示:

第一个拦截器的引用包 AspectCore.Extensions.DependencyInjection

第二个是依赖注入的包 Microsoft.Extensions.DependencyInjection

技术图片

 

 

创建一个接口:

using System;
using System.Collections.Generic;
using System.Text;

namespace AOP_Demo

    public interface Imysql
    
        void Select(int i);
    

 

创建一个实现类

using System.Collections.Generic;
using System.Text;

namespace AOP_Demo

    class Mysql : IMysql
    
        [MyLogInterceptor]
        public void Select(int i)
        
            Console.WriteLine("查询的结果是:"+i);
        
    

 

创建一个日志拦截器

using AspectCore.DynamicProxy;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; 

namespace AOP_Demo

    public class MyLogInterceptorAttribute : AbstractInterceptorAttribute
    
        public override Task Invoke(AspectContext context, AspectDelegate next)
        
            Console.WriteLine("方法执行前的日志");
            var task = next(context);
            Console.WriteLine("方法执行后的日志");
            return task;
        
    

 

 

然后在程序入口处编写相关代码

using Microsoft.Extensions.DependencyInjection;
using System;
using AspectCore.Extensions.DependencyInjection;
using AspectCore.Configuration;

namespace AOP_Demo
 
    class Program
    
        static void Main(string[] args)
        
            ServiceCollection serviceDescriptors = new ServiceCollection();
            //配置动态代理
            serviceDescriptors.ConfigureDynamicProxy(config => 
                config.Interceptors.AddTyped<MyLogInterceptorAttribute>(); 
            );
            //注册服务
            serviceDescriptors.AddTransient<IMysql, Mysql>();
            //提供者
            IServiceProvider serviceProvider = serviceDescriptors.BuildDynamicProxyServiceProvider();
            //获得服务
            var Provider= serviceProvider.GetService<IMysql>();
            //调用方法
            Provider.Select(1);
            Console.ReadKey();
        
    

 

上面代码中,我们需要把拦截器通过动态代理的方式注入到IOC容器中。

 

所思:面向切面就是在原来的服务上添加一点新的功能,而且这个添加的功能还不能对原来的代码进行大改特改,尽可能的降低新功能和原来功能的耦合性,我觉得可以很好的运用在日志,异常处理等方面。

 

以上是关于asp.net core的AOP记录的主要内容,如果未能解决你的问题,请参考以下文章

[Asp.Net Core] Autofac支持AOP-2

[Asp.Net Core]Autofac抽象支持AOP

[Asp.Net Core]Autofac抽象支持AOP

3 .NET Core笔试题

[Asp.Net Core]ActionFilter的特点

在 ASP.NET Core 应用程序中禁用 Quartz.Net 的调试日志记录