ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截
觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐
这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度.
目录
ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
上一篇我们讲了如何将默认的容器替换为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
三部曲到此就结束了. 喜欢的请点个推荐和关注,~有问题也希望各位批评指正~.
ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)的更多相关文章
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ASP.NET Core 中文文档 第三章 原理(1)应用程序启动
原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...
- ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化
原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...
- ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态
原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...
- ASP.NET Core中使用GraphQL - 第三章 依赖注入
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 SOL ...
- ASP.NET Core 中文文档 第三章 原理(10)依赖注入
原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...
- ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作
原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...
- ASP.NET Core 中文文档 第三章 原理(17)为你的服务器选择合适版本的.NET框架
原文:Choosing the Right .NET For You on the Server 作者:Daniel Roth 翻译:王健 校对:谢炀(Kiler).何镇汐.许登洋(Seay).孟帅洋 ...
随机推荐
- springboot小技巧(转)
一些springboot小技巧.小知识点 初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用Jpa,另外一种是Spring JDBC.两种方式各有区别下面 ...
- iOS 获取一个不变的UDID
原文:iOS7: 如何获取不变的UDID 如何使用KeyChain保存和获取UDID 本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID ...
- Python学习日记:day1
1.计算机基础 cpu:相当于人的大脑,用于计算. 内存:储存数据,运行速度快,成本高,断电数据消失. 硬盘 :固态硬盘(快).机械硬盘(有指针).储存数据,需要长期保持数据,重要文件 打开qq过程: ...
- nginx编译参数的内容
最近公司安排我安装几台云服务器环境 采用nginx做反向代理: 查了一下官方文档,参数比较多,很多在上线后 可能才知道注意一下的. 编译安装nginx的话 需要安装一些前置组件: 1.gcc环境:用于 ...
- java I/O---复制文本文件
利用FileInputStream 和FileOutputStream 复制文本 1 public class CopyTextByBuffer { 2 3 /** 4 * @param args 5 ...
- C# 内存模型
C# 内存模型 This is the first of a two-part series that will tell the long story of the C# memory model. ...
- ECMAScript中的两种属性
数据属性 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性一般用于存储数据数值. 数据属性有4个描述其行为的特征. configurable:true/false,是否可以通过del ...
- Linux第七节随笔 diff /uniq /stat
linux第七讲(上)1.diff link 作用:diff命令能比较单个文件或者目录内容.如果指定比较的是文件,则只有当输入为文本文件时才有效.以逐行的方式,比较文本文件的异同处. 如果指定比较的是 ...
- vue基础学习(一)
01-01 vue使用雏形 <div id="box"> {{msg}} </div> <script> window.onload= func ...
- 在ubuntu上安装pyenv出现的问题
1.安装完pyenv时,并没有出现问题.但在安装python3.6.1时报错: ERROR: The Python ssl extension was not compiled. Missing th ...