本文主要是详解一下在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. ZJOI2013 K大数查询 和 LG3380【模板】二逼平衡树(树套树)

    K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c:如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的 ...

  2. LOAD DATA INFILE & mysqlimport

    +++++++++++++++++++++++++++++++++++++++++++++mysqlimport++++++++++++++++++++++++++++++++++++++++++++ ...

  3. Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序

    Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的.   所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可 ...

  4. k8sStatefulSet控制器

    一.StatefulSet概述 应用程序存在有状态和无状态两种类别,因为无状态类应用的pod资源可按需增加.减少或重构,而不会对由其提供的服务产生除了并发相应能力之外的其他严重影响.pod资源的常用控 ...

  5. Junit(手动/自动)加载

    ssm中测试service层数据 Junit手动加载配置文件 package com.oukele.bookshop_ssm.service; import org.junit.After; impo ...

  6. 特征工程之分箱--Best-KS分箱

    变量的KS值 KS(Kolmogorov-Smirnov)用于模型风险区分能力进行评估,指标衡量的是好坏样本累计部分之间的差距 .KS值越大,表示该变量越能将正,负客户的区分程度越大.通常来说,KS& ...

  7. 《剑指offer》算法题第九天

    今日题目: 整数中1出现的次数 把数组排成最小的数 丑数 第一个只出现一次的字符位置 今天的题目相对比较难,特别是第1题和第3题很考验数学功底,下面我们一题一题来看看. 1.整数中1出现的次数 题目描 ...

  8. HDU - 6183 暴力,线段树动态开点,cdq分治

    B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...

  9. 关于博主&&联系博主

    关于我自己 天朝一名普通理科男高中生,现正读高二. 一位正在求学之路上奋斗的蒟蒻.很爱听歌,欧美为主,霉霉死粉.交际方面比较弱. 常用编辑器为DEV-C++,编译器为gcc,常用OJ是洛谷 基本熟练使 ...

  10. Uva 10129 Play on Words(欧拉路)

    一些秘密的门包含一个非常有趣的单词拼图.考古学家们必须解决的问题 它打开那门.因为没有其他的方式来打开大门,这个谜是非常重要的 我们. 每扇门上都有大量的磁性板.每一个盘子上都有一个字 它.板块必须以 ...