ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

2023-11-06 16:38

本文主要是介绍ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)我们讲了如何将默认的容器替换为Autofac,并使用属性注入.那么这一篇我们就来讲讲如何利用Autofac实现我们的AOP(面向切面编程) .

1.引用正确的库来实现AOP

既然是跨平台,那么在asp.net core因为采用了.net core来作为基础库(当然,其实你可以换成.NET4.6.).

新的.NET Core是基于.NET Standard的..所以我们在引用库的时候特别要注意相关的兼容问题.

在传统的ASP.NET中,使用过Autofac来进行AOP操作的,应该都知道这个库.

Autofac.Extras.DynamicProxy

那么我们来看看它的依赖项.如图:

.NET Standard的情况下,他需要Autofac4.0+,这个就不多说了.关键在下面这个,他需要Castle.Core4.0+.

所以,当我们直接安装这个库的时候,Nuget会自动关联并安装最新的Castle.Core4.2.1版本..

那么问题就出现了..在项目的依赖项中,会发现很多警告:

 

我们进入警告会发现..都是提示缺少兼容的最新的类型转换类.如图:

而且Castle.Core是属于AutoFac下面的..如图:

我们直接通过Nuget查找Castle.Core.

可以发现,它需要System.ComponentModel.TypeConverter4.3..

我们直接安装它,Nuget则会直接帮我们把System.ComponentModel.TypeConverter更新到4.3的版本..

然后重新通过Nuget安装Autofac.Extras.DynamicProxy..就可以了.如图:

 

其实这应该算一个Nuget的BUG..它会帮你引用库的相关依赖..但是当依赖还有依赖需要更新的时候..它就不会更新..

这个时候我们换一种思维..返回来 一步步引用.就可以了.. 

2.采用Autofac来实现AOP

首先,我们创建一个拦截类,代码如下:

public class AOPTest : IInterceptor

    {

        public void Intercept(IInvocation invocation)

        {

            System.Diagnostics.Debug.WriteLine("你正在调用方法 \"{0}\"  参数是 {1}... ",

               invocation.Method.Name,              

               string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));

            //在被拦截的方法执行完毕后 继续执行           

            invocation.Proceed();


            System.Diagnostics.Debug.WriteLine("方法执行完毕,返回结果:{0}", invocation.ReturnValue);

        }

    }

这里,需要继承IInterceptor,然后实现它的Intercept方法..我们直接将拦截内容输出到调试窗(正式项目..请根据业务来操作拦截)..

找到我们要拦截的服务.并设置拦截特性(有多种方式.用特性的方式作为例子..个人也觉得特性AOP拦截比较方便),代码如下:

[Intercept(typeof(AOPTest))]

    public class TestService: ITestService

    {

        public TestService()

        {

            MyProperty = Guid.NewGuid();

        }

        public Guid MyProperty { get; set; }

        public List<string> GetList(string a)

        {

            return new List<string>() { "LiLei", "ZhangSan", "LiSi" };

        }

    }

然后在容器中注入我们的AOP拦截类,并开启服务的拦截状态.代码如下:

public class DefaultModule : Module

    {

        protected override void Load(ContainerBuilder builder)

        {


            builder.Register(c => new AOPTest());

            builder.RegisterType<TestService>().As<ITestService>().PropertiesAutowired().EnableInterfaceInterceptors();

        }

    }


这里注意,一定要在你注入的服务后面加上EnableInterfaceInterceptors来开启你的拦截.

然后在控制器中调用服务的方法,代码如下:

public class AutoDIController : Controller

    {


        public  ITestService _testService { get; set; }


        

        // GET: AutoDI

        public ActionResult Index()

        {

            ViewBag.date = _testService.GetList("Name");

            return View();

        }

}

然后我们运行代码.

效果如下:

这样,我们就完成了使用Autofac进行AOP拦截..

Autofac的AOP拦截器还有很多功能与用法.我这里就不一一举例了..请参考官网:http://docs.autofac.org/en/latest/advanced/interceptors.html

相关文章:

原文地址:https://www.cnblogs.com/GuZhenYin/p/8301500.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

这篇关于ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/357801

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(