本文主要是详解一下在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. mysqltuner对数据库的优化

    主要用于对mysql配置及my.cnf配置检查,提供详细信息,为进一步优化mysql做参考. 下载地址: (1)http://mysqltuner.com/ (2)脚本获取# wget -c http ...

  2. 解决使用vue打包时vendor文件过大或者是app.js文件很大的问题

    这篇文章主要介绍了使用vue打包时vendor文件过大或者是app.js文件很大问题的解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 第一次使用vue2.0开发,之前都是用的angu ...

  3. 如何获取到一个form中的所有子控件?

    使用yield关键字,非常的方便 private static IEnumerable<Control> GetChildren(Control frmRootDock) { if (fr ...

  4. 08 saltstack生产实例-apahce+php+redis

    1.apache+php 前几章的LAMP:https://www.cnblogs.com/venicid/p/11276232.html#_label2 Php放在apache 1.目录结构 2.p ...

  5. 2 APIView与序列化组件

    1.入门 1.1 参考blog 官方文档:http://www.django-rest-framework.org/tutorial/quickstart/#quickstart yuan的Blog: ...

  6. PHP基础之搭建WAMP环境

    访问 http://www.wampserver.com/en/ 点击 点击 点击 由于WAMP需要 Microsoft Visual C++运行库支持,请先到 这里 下载VC++2012运行库.官方 ...

  7. 题解 【POJ1157】LITTLE SHOP OF FLOWERS

    先把题目意思说一下: 你有F束花,编号为\(1\)~\(F\)(\(1<=F<=100\)),\(V\)个花瓶,编号为\(1\) ~\(V\)(\(1<=V<=100\)), ...

  8. URAL 2092 Bolero 贪心

    C - Bolero Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  9. PHP-windows下安装

    下载 Apache下载地址:http://httpd.apache.org/download.cgi PHP下载地址:http://php.net/downloads.php 解压 解压到安装路径下H ...

  10. django-rest-framework之 json web token方式完成用户认证

    json web token的介绍:https://blog.csdn.net/kevin_lcq/article/details/74846723 1. 安装 $ pip install djang ...