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).孟帅洋 ...
随机推荐
- MyBatis SQL处理大于、小于号
MyBatis mapper文件是xml文件,需要特殊字符如大于号.小于号后需要转义. 原字符 转义后字符 < < <= <= > > > >=
- 盘点selenium phantomJS使用的坑
参考:http://www.jianshu.com/p/9d408e21dc3a http://www.cnblogs.com/luxiaojun/p/6144748.html 豆瓣应该是ip被封 ...
- Bandit Wargame Level18 Writeup(interactive shell and .bashrc )
Bandit Level 18 → Level 19 Level Goal The password for the next level is stored in a file readme in ...
- [UWP]了解TypeConverter
1. 前言 TypeConverter是XAML解释器的幕后功臣,它做了大量工作,从WPF诞生以来,几乎每一次XAML的运作都有它的参与.虽然UWP中TypeConverter已经彻彻底底退居幕后,连 ...
- javascript-发布订阅模式
说明:本篇文章转载自小火柴的蓝色理想的一篇博文.原文地址:http://www.cnblogs.com/xiaohuochai/p/8031564.html 发布-订阅模式又叫观察者模式,它定义对象间 ...
- python scipy计算机数值库
scripy有聚类的python 代码,如: http://blog.csdn.net/elaine_bao/article/details/50242867
- GitLab版本管理工具
第1章 GitLab管理 1.1 版本控制系统 版本控制系统(version control system)是记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.版本控制系统不仅可以应用于 ...
- open-falcon(v0.2)部署手册(源码编译)
今天安装falcon-plus,下面为用基础环境配置. centos 6.8 alisql5.6.32 redis-3.2.8 cmake-3.9.1 bison-3.0 openssl-1.0 ...
- 干货分享!关于APP导航菜单设计你应该了解的一切
导航菜单是人机交互的最主要的桥梁和平台,主要作用是不让用户迷失方向.现在市面上产品的菜单栏种类繁多,到底什么样的才是优秀的导航菜单设计呢?好的菜单设计不仅能提升整个产品的用户体验,而且还能让用户耳目一 ...
- nova创建虚拟机源码分析系列之四 nova代码模拟
在前面的三篇博文中,介绍了restful和SWGI的实现.结合restful和WSGI配置就能够简单的实现nova服务模型的最简单的操作. 如下的内容是借鉴网上博文,因为写的很巧妙,将nova管理虚拟 ...