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

Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。

引入类库

nuget命令如下:

  1. Install-Package Autofac.Extras.DynamicProxy -Version 4.5.0

复制代码

<ignore_js_op>

采用Autofac来实现AOP

首先,我们创建一个拦截类,代码如下:

  1. public class AOPTest : IInterceptor
  2. {
  3. public ILogger<AOPTest> _logger { get; set; }
  4. public void Intercept(IInvocation invocation)
  5. {
  6. _logger.LogWarning("你正在调用方法 "{0}"  参数是 {1}... ",
  7. invocation.Method.Name,
  8. string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));
  9. //在被拦截的方法执行完毕后 继续执行
  10. invocation.Proceed();
  11. _logger.LogWarning("方法执行完毕,返回结果:{0}", invocation.ReturnValue);
  12. }
  13. }

复制代码

这里,需要继承IInterceptor,然后实现它的Intercept方法..我们直接将拦截内容输出到调试窗(正式项目..请根据业务来操作拦截)..

这里我通过ILogger来记录操作,参考如下:

ASP.NET Core ILogger日志使用教程
https://www.itsvse.com/thread-7565-1-1.html
(出处: 架构师_程序员)

找到我们要拦截的服务,TestService1和TestService2,我们通过两种方式来拦截。

TestService1:通过特性拦截
TestService2:通过配置拦截

代码如下:

  1. public interface IBaseTestService
  2. {
  3. string GetString();
  4. }
  5. public interface ITestService1: IBaseTestService { }
  6. public interface ITestService2 : IBaseTestService { }
  7. public interface ITestService3 : IBaseTestService { }
  8. [Intercept(typeof(AOPTest))]
  9. public class TestService1 : ITestService1
  10. {
  11. private string str { get; set; }
  12. public TestService1()
  13. {
  14. str = Guid.NewGuid().ToString();
  15. }
  16. public string GetString()
  17. {
  18. return str;
  19. }
  20. }
  21. public class TestService2 : ITestService2
  22. {
  23. private string str { get; set; }
  24. public TestService2()
  25. {
  26. str = Guid.NewGuid().ToString();
  27. }
  28. public string GetString()
  29. {
  30. return str;
  31. }
  32. }
  33. public class TestService3 : ITestService3
  34. {
  35. private string str { get; set; }
  36. public TestService3()
  37. {
  38. str = Guid.NewGuid().ToString();
  39. }
  40. public string GetString()
  41. {
  42. return str;
  43. }
  44. }

复制代码

在Startup编辑方法ConfigureServices,通过配置拦截TestService2服务,如下:

  1. public IServiceProvider ConfigureServices(IServiceCollection services)
  2. {
  3. services.Configure<CookiePolicyOptions>(options =>
  4. {
  5. // This lambda determines whether user consent for non-essential cookies is needed for a given request.
  6. options.CheckConsentNeeded = context => true;
  7. options.MinimumSameSitePolicy = SameSiteMode.None;
  8. });
  9. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices(); ;
  10. //添加数据库上下文和配置数据库连接字符串
  11. PanDb.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
  12. services.AddDbContext<PanDb>();
  13. var builder = new ContainerBuilder();
  14. builder.Populate(services);//Autofac.Extensions.DependencyInjection
  15. builder.RegisterInstance(new LoggerFactory())
  16. .As<ILoggerFactory>();
  17. builder.RegisterGeneric(typeof(Logger<>))
  18. .As(typeof(ILogger<>))
  19. .SingleInstance();
  20. //注册服务
  21. builder.Register(c => new AOPTest());
  22. builder.RegisterType<TestService1>().As<ITestService1>().PropertiesAutowired().EnableInterfaceInterceptors();
  23. builder.RegisterType<TestService2>().As<ITestService2>().PropertiesAutowired().EnableInterfaceInterceptors().InterceptedBy(typeof(AOPTest));
  24. builder.RegisterType<TestService3>().As<ITestService3>().PropertiesAutowired();
  25. //注册所有控制器
  26. var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
  27. .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
  28. builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
  29. builder.RegisterType<AOPTest>().PropertiesAutowired();
  30. var container = builder.Build();
  31. var loggerFactory = container.Resolve<ILoggerFactory>();
  32. loggerFactory.AddConsole();
  33. return new AutofacServiceProvider(container);
  34. }

复制代码

重要的代码就如下3行:

  1. builder.Register(c => new AOPTest());
  2. builder.RegisterType<TestService1>().As<ITestService1>().PropertiesAutowired().EnableInterfaceInterceptors();
  3. builder.RegisterType<TestService2>().As<ITestService2>().PropertiesAutowired().EnableInterfaceInterceptors().InterceptedBy(typeof(AOPTest));

复制代码

这里注意,一定要在你注入的服务后面加上EnableInterfaceInterceptors来开启你的拦截

控制器代码如下:

  1. public class HomeController : Controller
  2. {
  3. public ILogger<HomeController> test { get; set; }
  4. public ITestService1 _testService1 { get; set; }
  5. public ITestService2 _testService2 { get; set; }
  6. public ITestService3 _testService3 { get; set; }
  7. public IActionResult Index()
  8. {
  9. test.LogError("https://www.itsvse.com");
  10. test.LogWarning("访问home index页面!");
  11. ViewBag.Str1 = _testService1.GetString();
  12. ViewBag.Str2 = _testService2.GetString();
  13. ViewBag.Str3 = _testService3.GetString();
  14. return View();
  15. }
  16. }

复制代码

通过dotnet run命令启动项目,访问网址,控制台输出日志如下:

<ignore_js_op>

QQ截图20190508145507.jpg (124.68 KB, 下载次数: 11)

下载附件

2019-5-8 15:07 上传

 

发现通过aop拦截到的返回值和返回给网页的返回值是一样的,这样,我们就完成了使用Autofac进行AOP拦截。

(完)

 

Autofac实现AOP拦截的更多相关文章

  1. ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

    前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...

  2. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  3. 运用Unity实现AOP拦截器

    运用Unity实现AOP拦截器[结合异常记录实例] 本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运 ...

  4. JS实现AOP拦截方法调用

    //JS实现AOP拦截方法调用function jsAOP(obj,handlers) {    if(typeof obj == 'function'){        obj = obj.prot ...

  5. 关于spring的aop拦截的问题 protected方法代理问题

    看到一篇很好的Spring aop 拦截方法的问题,  原文地址. 问题 貌似不能拦截私有方法? 试了很多次,都失败了,是不是不行啊? 我想了一下,因为aop底层是代理, jdk是代理接口,私有方法必 ...

  6. aop 拦截含有特定注解的类

    1.功能点:使用aop拦截含有自定义注解的类 1.自定义注解 package com.zhuanche.common.dingdingsync; import java.lang.annotation ...

  7. Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  8. C# unity 的 IInterceptionBehavior实现aop拦截器

    以前项目写过使用unity的 IInterceptionBehavior 实现aop拦截器,时间不多就忘了,项目找不到了,然后呢,写个简单的例子,用的收直接用就行了,简单实用,至于什么用,mvc的at ...

  9. springboot项目:登录 登录aop拦截 使用Redis与cookie 进行设置获取清除操作

    登录.登出: 第一步:在pom文件中引入依赖 <dependency> <groupId>org.springframework.boot</groupId> &l ...

随机推荐

  1. springboot-rabbitmq的使用

    一.RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...

  2. docker及k8s安装consul

    一.docker部署consul集群 参考文献:https://www.cnblogs.com/lonelyxmas/p/10880717.html https://blog.csdn.net/qq_ ...

  3. BZOJ 2882: 工艺 (SA/SAM/最小表示法)

    我写的O(nlogn)O(nlogn)O(nlogn)的SA 8000ms 被 O(n)O(n)O(n)的SAM 2800ms 和 O(n)O(n)O(n)的最小表示法 500ms 头都锤爆- COD ...

  4. 【51nod 1667】概率好题

    题目 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S2同理 若S1>S2甲胜 若S1=S2平局 否则乙胜 分别 ...

  5. Servlet中的乱码问题及解决办法

    假设现在有个form表单,当页面中提交一个包含中文的请求时,在服务端有可能出现中文乱码问题. <!DOCTYPE html> <html> <head> <m ...

  6. Golang ioutil.ReadDir 读取目录下的内容并排序

    之前写的https://www.cnblogs.com/pu369/p/10620731.html一文中,也有对slice的排序,但代码乱的自己也看不下去了. 参考https://blog.csdn. ...

  7. 第03组 Alpha冲刺(3/4)

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...

  8. Linux网络编程三、 IO操作

    当从一个文件描述符进行读写操作时,accept.read.write这些函数会阻塞I/O.在这种会阻塞I/O的操作好处是不会占用cpu宝贵的时间片,但是如果需要对多个描述符操作时,阻塞会使同一时刻只能 ...

  9. [CSP-S模拟测试]:A(数学)

    题目传送门(内部题44) 输入格式 一行四个整数,分别表示$S,T,a,b$. 输出格式 输出最小步数,数据保证有解. 样例 样例输入: 10 28 4 2 样例输出: 数据范围与提示 样例解释: 先 ...

  10. react 路由

    react 提供了实现路由的方式,不过需要我们下载插件 react-router-dom 当我们下载好了插件,然后我们可以通过 import {} from 'react-router-dom' 来引 ...