本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截html
以为有帮助的朋友~能够左上角点个关注,右下角点个推荐编程
这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的能够自行百度.asp.net
ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)ide
ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)post
ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)ui
上一篇咱们讲了如何将默认的容器替换为Autofac,并使用属性注入.spa
那么这一篇咱们就来说讲如何利用Autofac实现咱们的AOP(面向切面编程) ..net
既然是跨平台,那么在asp.net core由于采用了.net core来做为基础库(固然,其实你能够换成.NET4.6.).调试
新的.NET Core是基于.NET Standard的..因此咱们在引用库的时候特别要注意相关的兼容问题.code
在传统的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..它会帮你引用库的相关依赖..可是当依赖还有依赖须要更新的时候..它就不会更新..
这个时候咱们换一种思惟..返回来 一步步引用.就能够了..
首先,咱们建立一个拦截类,代码以下:
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
三部曲到此就结束了. 喜欢的请点个推荐和关注,~有问题也但愿各位批评指正~.