Autofac实现AOP拦截

本文主要是详解一下在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拦截。

(完)

autofaciocaop拦截

原文地址:https://www.cnblogs.com/cider/p/11732161.html

时间: 2024-08-01 08:13:36

Autofac实现AOP拦截的相关文章

netcore使用AutoFac实现AOP

原文:netcore使用AutoFac实现AOP 第一步,添加程序集引用 在Nuget中搜索autofac找到Autofac.Extras.DynamicProxy并安装. 第二步:添加拦截器 /// <summary> /// 拦截器(实现 Castle.DynamicProxy.IInterceptor)接口 /// </summary> public class CustomAutoFacAOPInterception : IInterceptor { public void

spring面向切面aop拦截器

spring中有很多概念和名词,其中有一些名字不同,但是从功能上来看总感觉是那么的相似,比如过滤器.拦截器.aop等. 过滤器filter.spring mvc拦截器Interceptor .面向切面编程aop,实际上都具有一定的拦截作用,都是拦截住某一个面,然后进行一定的处理. 在这里主要想着手的是aop,至于他们的比较,我想等三个都一一了解完了再说,因此这里便不做过多的比较. 在我目前的项目实践中,只在一个地方手动显示的使用了aop,那便是日志管理中对部分重要操作的记录. 据我目前所知,ao

【框架】[Spring]AOP拦截-使用切点:AspectJExpressionPointcut-切点语言

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 用AspectJExpressionPointcut实现的切点比JdkRegexpMethodPointcut实现切点的好处就是,在设置切点的时候可以用切点语言来更加精确的表示拦截哪个方法! 可以精确到返回参数,参数类型,方法名. 当然,也可以模糊匹配. 这里用纯Java的方式和配置xml的方法都来演示一遍. 需要的包什么的就不解释了,如不动,请参考前面的. 首先,准备好原型对象P

用户操作拦截并作日志记录--自定义注解+AOP拦截

作为运营除了处理系统生产问题,还要处理大量的用户上报事件,这部分工作占用了大量的人力.所有考虑把一部分事件查询处理做成一个自助平台,让用户自行核查处理.于是就有了用户自助系统.考虑到如何计量这个工具平台具体的实现价值,需要做用户操作统计才能给出可信服的数据. 以上就是本文的背景.自助系统的架构就是传统的springmvc+spinrg+mybatis+oracle.想到日志记录首先想到的就是AOP拦截处理.网上相关的技术贴很多.简单的小项目遇到的问题一般度娘都能给解决了~\(≧▽≦)/~ 自定义

JS实现AOP拦截方法调用

//JS实现AOP拦截方法调用function jsAOP(obj,handlers) {    if(typeof obj == 'function'){        obj = obj.prototype;    }    for(var methodName in handlers){        var _handlers = handlers[methodName];        for(var handler in _handlers){            if((hand

使用AOP拦截器获取一次请求流经方法的调用次数和调用耗时

引语 作为工程师,不能仅仅满足于实现了现有的功能逻辑,还必须深入认识系统.一次请求,流经了哪些方法,调用了多少次DB操作,多少次API操作,多少次IO操作,多少CPU操作,各耗时多少 ? 开发者必须知道这些运行时数据,才能对系统的运行有更深入的理解,更好滴提升系统的性能和稳定性. 完成一次订单导出任务,实际上是一个比较复杂的过程:需要访问ES 来查询订单,调用 API 及访问 Hbase 获取订单详情数据,写入和上传报表文件,更新数据库,上报日志数据等:在大流量导出的情形下,采用批量并发策略,多

aop 拦截含有特定注解的类

1.功能点:使用aop拦截含有自定义注解的类 1.自定义注解 package com.zhuanche.common.dingdingsync; import java.lang.annotation.*; /** * @Author fanht * @Description 含有该注解的controller方法存储到mq * @Date 2019/2/28 上午11:26 * @Version 1.0 */ @Retention(RetentionPolicy.RUNTIME) @Target

.NET Core下自带容器IServiceCollection以及AutoFac以及AutoFac中AOP简介

https://www.cnblogs.com/artech/p/net-core-di-01.html 大内老A的在.NET Core下对这些的介绍,有一系列文章 https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html https://www.cnblogs.com/artech/p/dependency-injection-in-asp-net-core.html https://www.zybuluo.com/dasajia2la

直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题

直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题.近日工作中,要实现一个功能,那就是业务层方法里面实现自动缓存.编写业务的C#开发人员只关注如何将业务代码编写正确就可以了,而缓存的代码,大多类似,无非就是判断是否有缓存,有就取出返回,没有就调用数据库代码获取数据再缓存起来而已,于是这部分代码通过使用AOP的方式自动接管掉这种重复性代码. MrAdvice开源项目github地址:https://github.com/ArxOne/MrAdvice 直接引用MrAdv