本文主要是详解一下在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. SAP笔记

    1,负数的表示增强 负号从数字后更改到数字前面 适用于字符型字段: CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT' CHANGING VALUE = gt_table-c ...

  2. Java 包装类及其与String转换、进制转换

    一.包装类 1.基本类型和引用类型 Java中的基本类型我们都知道有8种,但是作为基本类型限制功能的发挥,例如整形转String类型等可能需要类方法实现会更加简便.那么八个基本类型对应八个包装类,即引 ...

  3. 页面初次渲染loading图

    当第一次进入页面时,可能由于网速或其他原因请求接口需要等待很长时间,这是页面一片空白,很难看,切交互性也不好,这是,我们常常放上一个loading等待图给用户以反馈 // 页面尚未加载时的loadin ...

  4. jpa介绍

    1.jpa的介绍 JPA是Java Persistence API的简称, 中文名为Java持久层API; 是JDK 5.0注解或XML描述对象-关系表的映射关系, 并将运行期的实体对象持久化到数据库 ...

  5. Confluence 6.15 使用附件宏

    希望添加附件宏到一个页面中: 从编辑工具栏中,选择 插入(Insert)   > 其他宏(Other Macros) 找到并且选择需要的宏. 可用使用自动完成加快这个过程:输入 { 然后开始输入 ...

  6. Dungeon Master (POJ - 2251)(BFS)

    转载请注明出处: 作者:Mercury_Lc 地址:https://blog.csdn.net/Mercury_Lc/article/details/82693907 题目链接 题解:三维的bfs,一 ...

  7. CF762F Tree nesting

    题目连接 问题分析 可以给小树钦定一个根, \(Dp[i][j]\) 表示大树上的点 \(i\) 对应到小树上的点 \(j\) 的可能的方案数.然后每一步转移都是一个状压DP(将小树是否被匹配状压,然 ...

  8. 24.Python比较运算符(关系运算符

    比较运算符,也成关系运算符,用于对常量.变量或表达式的结果进行大小.真假等比较,如果比较结果为真,则返回 True:反之,则返回 False. Python 支持的比较运算符如表 1 所示. 表 1 ...

  9. MySQL_(Java)使用JDBC创建用户名和密码校验查询方法

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL数据库中的数据,数据库名garysql,表名garytb,数据库中存在的用户表 通过JDBC对MySQL中的数据用户名和密码 ...

  10. JavaWeb_(Struts2框架)使用Struts框架实现用户的登陆

    JavaWeb_(Struts2框架)使用Servlet实现用户的登陆 传送门 JavaWeb_(Struts2框架)Servlet与Struts区别 传送门 MySQL数据库中存在Gary用户,密码 ...