• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

asp.netcore的AOP记录

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

序曲:学习编程最好的方式就是敲代码,没有比这个更好的方法,哪怕你看了上百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容器中。

 

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET构建网站必备的七种工具发布时间:2022-07-10
下一篇:
Asp.NetSignalR使用记录发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap