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容器中。

 

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

 

posted @ 2019-10-04 19:25  流月无双  阅读(1118)  评论(3编辑  收藏  举报