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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel(六)之集群流控

转载自 集群流控 介绍 为什么要使用集群流控呢&#xff1f;假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50&#xff0c;但机器数可能很多&#xff08;比如有 100 台&#xff09;。这时候我们很自然地就想到&#xff0c;找一个 server 来专门来统计总的调用量&#…

P4597-序列sequence【堆】

正题 题目链接:https://www.luogu.org/problemnew/show/P4597 题目大意 一个长度为nnn的序列&#xff0c;每次可以将一个数111或−1-1−1。要求 变成一个非降序列出现的数之前都在原序列 解题思路 我们考虑一下贪心&#xff0c;由于变成一个非降序列&#xff0c;所以肯定越…

Mybatis-Plus基本

Data AllArgsConstructor//全参构造 NoArgsConstructor//无参构造 Accessors(chain true)//链表模式 TableName("User")//映射数据表名 public class User implements Serializable {//序列化传输保证数据完整TableId(type IdType.UUID)//设定主键自增private Inte…

Sentinel(七)之网关限流

转载自 网关限流 Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块&#xff0c;此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑&#xff1a; GatewayFlowRule&…

P1941-飞扬的小鸟【dp】

正题 题目链接:https://www.luogu.org/problemnew/show/P1941 题目大意 n∗mn*mn∗m的场地&#xff0c;一只鸟&#xff0c;在iii格点击一次升XiX_iXi​格(可以点击多次)&#xff0c;不点击掉YiY_iYi​格。不能落地&#xff0c;最高mmm格&#xff0c;然后不能撞到地图上的一些管…

C# 7编程模式与实践

C# 7是一个重大更新&#xff0c;其中提供了很多有意思的新功能。虽然已有大量的文章介绍这些功能可以做什么&#xff0c;但是鲜有文章介绍应如何使用这些功能。本文将过一遍《.NET设计规范&#xff1a;.NET约定惯用法与模式》&#xff08;译者注&#xff1a;英文书名为“Framew…

过来瞅瞅学学

当需要对Date时间类型进行加减int类型分钟运算 Date date new Date();//Sun Mar 06 14:12:14 CST 2022int hour 25;int minutes 70;int second 3;SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(simpleDat…

Sentinel(八)之熔断降级

转载自 熔断降级 概述 除了流量控制以外&#xff0c;对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块&#xff0c;可能是另外的一个远程服务、数据库&#xff0c;或者第三方 API 等。例如&#xff0c;支付的时候&#xff0c…

P4719-[模板]动态DP【矩阵乘法,树链剖分,线段树】

正题 题目链接:https://www.luogu.org/problemnew/show/P4719\texttt{https://www.luogu.org/problemnew/show/P4719}https://www.luogu.org/problemnew/show/P4719 题目大意 每次修改一个点权&#xff0c;求最大权独立集。 解题思路 首先考虑普通dpdpdp&#xff0c;设fi,0/…

.net的retrofit--WebApiClient底层篇

前言本篇文章的内容是WebApiClient底层说明&#xff0c;也是WebApiClient系列接近尾声的一篇文章&#xff0c;如果你没有阅读过之前的的相关文章&#xff0c;可能会觉得本文章的内容断层库简介WebApiClient是开源在github上的一个httpClient客户端库&#xff0c;内部基于HttpCl…

悲观锁和乐观锁

悲观锁 悲观&#xff0c;则会假设情况总是最坏的&#xff0c;即共同维护的数据总会被其他线程修改&#xff0c;所以每次取数据的时候都会上锁&#xff0c;避免其他人修改。 synchronized 关键字的实现也是悲观锁。 悲观锁的缺点 在多线程竞争下&#xff0c;加锁、释放锁会导致…

Sentinel(九)之热点参数限流

转载自 热点参数限流 Overview 何为热点&#xff1f;热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据&#xff0c;并对其访问进行限制。比如&#xff1a; 商品 ID 为参数&#xff0c;统计一段时间内最常购买的商品 ID 并进行限制用户 …

jzoj3318-[BOI2013]Brunhilda的生日【数论】

正题 题目大意 序列aaa有mmm个质数。然后询问一个数nnn&#xff0c;每次可以使nn−n%ainn-n\%a_{i}nn−n%ai​ 求最少操作次数。 解题思路 首先我们设fif_ifi​表示由iii变为0的最少次数&#xff0c;然后有动态转移fimin{fi−i%aj}1f_imin\{f_{i-i\%a_j}\}1fi​min{fi−i%aj​…

【直播 】ASP.NET Core解密底层设计逻辑

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

Sentinel(十)之系统自适应限流

转载自 系统自适应限流 Sentinel 系统自适应限流从整体维度对应用入口流量进行控制&#xff0c;结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标&#xff0c;通过自适应的流控策略&#xff0c;让系统的入口流量和系统的负载达到一个平…

jzoj3319-[BOI2013]雪地踪迹【bfs】

正题 题目大意 一个n∗mn*mn∗m的雪地&#xff0c;有两种动物RRR和FFF会在雪地上留下RRR和FFF的脚印(只可以走到相邻格子&#xff0c;从(1,1)(1,1)(1,1)进入(n,m)(n,m)(n,m)出来&#xff0c;且会覆盖掉原先的脚印)。 求至少有多少只动物经过 解题思路 首先我们知道(1,1)(1,1…

如何ASP.NET Core Razor中处理Ajax请求

在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过。今天闲来无事,准备用Rozor做个项目熟练下,结果写第一个页面就卡住了。。折腾半天才搞好,下面给大家分享下解决方案。先来给大家简单介绍下RazorRazor Pages是ASP.NET Core的一项新功能&am…

Sentinel(十一)之黑白名单控制

转载自 黑白名单控制 很多时候&#xff0c;我们需要根据调用来源来判断该次请求是否允许放行&#xff0c;这时候可以使用 Sentinel 的来源访问控制&#xff08;黑白名单控制&#xff09;的功能。来源访问控制根据资源的请求来源&#xff08;origin&#xff09;限制资源是否通…

Loj2687,jzoj3320-文本编辑器【线头dp】

正题 题目链接:https://loj.ac/problem/2687 题目大意 三个操作: hhh光标向前移动一格xxx删除光标处字母fcf\ cf c移动到下一个字符ccc(算两次操作) 然后fff操作不能对字符eee使用&#xff0c;然后求最少操作次数删除所有的eee。 解题思路 线头dpdpdp。 设fi,jf_{i,j}fi,j​…

小白带你入坑xamarin系列之环境搭建和准备

序言&#xff1a;移动端的跨平台百花齐放&#xff0c;各种技术方案和方法都是层出不穷。目前xamarin确实是一套成熟可靠&#xff0c;完全值得信赖的开发框架。尤其是对传统做WPF ASP.NET的开发团队来说要节约成本开始移动端开发。这个是很好的一个选项。开始之前回答2个问题。1…