架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 667|回复: 4

[.NET Core] ASP.NET Core使用Autofac实现AOP拦截

[复制链接]
跳转到指定楼层
楼主
发表于 2019-5-8 15:09:15
zu
ASP.NET Core依赖注入使用自带的IOC容器
https://www.itsvse.com/thread-7562-1-1.html
(出处: 架构师_程序员)

ASP.NET Core使用Autofac实现IOC注入
https://www.itsvse.com/thread-7563-1-1.html
(出处: 架构师_程序员)

ASP.NET Core使用Autofac实现AOP拦截
https://www.itsvse.com/thread-7566-1-1.html
(出处: 架构师_程序员)

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

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

引入类库

nuget命令如下:
  1. Install-Package Autofac.Extras.DynamicProxy -Version 4.5.0
复制代码


采用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命令启动项目,访问网址,控制台输出日志如下:



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

(完)




上一篇:ASP.NET Core ILogger日志使用教程
下一篇:Django企业开发实战 高效Python Web框架指南 作者胡阳
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
沙发
发表于 2019-5-9 08:18:56
最好有实例源码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
板凳
 楼主| 发表于 2019-5-9 09:11:27
夏天 发表于 2019-5-9 08:18
最好有实例源码

项目包含敏感信息,就不发了,教程写的已经非常详细了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
地板
发表于 2019-5-9 11:15:17
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
回复

使用道具 举报

5#
发表于 2019-5-14 16:39:00
学习了,
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-9-18 07:08

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表