博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
阅读量:5809 次
发布时间:2019-06-18

本文共 2901 字,大约阅读时间需要 9 分钟。

前言

本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截

觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐

这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度.

目录

 

正文

上一篇我们讲了如何将默认的容器替换为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
GetList(string a) { return new List
() { "LiLei", "ZhangSan", "LiSi" }; } }

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

public class DefaultModule : Module    {        protected override void Load(ContainerBuilder builder)        {            builder.Register(c => new AOPTest());            builder.RegisterType
().As
().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/8309645.html

你可能感兴趣的文章
优秀程序员共有的7种优秀编程习惯
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
C#字符串的不变性
查看>>
前端路由简介以及vue-router实现原理
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
分享15款很实用的 Sass 和 Compass 工具
查看>>
AMD优势: 与众不同 选择丰富
查看>>
玩转高性能超猛防火墙nf-HiPAC
查看>>
简单按日期查询mysql某张表中的记录数
查看>>
自动化部署之jenkins发布PHP项目
查看>>
C/C++编程可用的Linux自带工具
查看>>
如何判断webview是不是滑到底部
查看>>
海贼王十大悲催人物
查看>>
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 搞定!
查看>>
热点热词新闻资讯API开放接口(永久免费开放)
查看>>