dotnetcore实现Aop
dotnetcore实现Aop
Aop大家都不陌生,然而今天给大家不将讲官方的filter,今天给大家分享一个轻量级的Aop解决方案(AspectCore)
什么是AspectCore
AspectCore是一个面向切面编程,基于.NetCore和.NetFramwork的扩平台框架,对方法拦截器、依赖项注入集成、web应用程序、数据验证等提供核心支持。
AspectCore基本特性
提供抽象的Aop接口,基于该接口可以轻松的使用自己的代理类实现替换默认的实现.
框架不包含IoC,也不依赖具体IoC实现,可以使用Asp.Net Core的内置依赖注入或者任何兼容Asp.Net Core的第三方Ioc来继承AspectCore到Asp.NetCore应用中
高性能的异步拦截系统
灵活的配置系统
基于service的而非基于实现类的切面构造
支持扩平台的Asp.Net Core环境
使用AspectCore
从NuGet中安装AspectCore
AspectCore.Extensions.DependencyInjection
package
PM> Install-package AspectCore.Extensions.DependencyInjection
下面我创建了一个Api应用程序.
NuGet安装
AspectCore.Configuration
package
PM> Install-package AspectCore.Configuration
下面我新建了一个拦截器 CustomInterceptorAttribute,继承AbstractInterceptorAttribute(一般情况下继承他即可),他实现IInterceptor接口AspectCore默认实现了基于Attribute的拦截器配置。
/// <summary>
/// 自定义拦截器
/// </summary>
public class CustomInterceptorAttribute : AbstractInterceptorAttribute
{
/// <summary>
/// 实现抽象方法
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
public override async Task Invoke(AspectContext context, AspectDelegate next)
{
try
{
Console.WriteLine("执行之前");
await next(context);//执行被拦截的方法
}
catch (Exception)
{
Console.WriteLine("被拦截的方法出现异常");
throw;
}
finally
{
Console.WriteLine("执行之后");
}
}
}
定义ICustomService接口和它的实现类CustomService:
public interface ICustomService
{
DateTime GetDateTime();
}
public class CustomService : ICustomService
{
public DateTime GetDateTime()
{
return DateTime.Now;
}
}
在ValuesController注入ICustomService
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly ICustomService _icustomserveice;
public ValuesController(ICustomService icustomService) {
this._icustomserveice = icustomService;
}
// GET api/values
[HttpGet]
public DateTime Get()
{
return _icustomserveice.GetDateTime();
}
}
注册ICustomService,并创建代理容器
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddTransient<ICustomService,CustomService>();
services.AddMvc();
//全局拦截器。使用AddDynamicProxy(Action<IAspectConfiguration>)的重载方法,其中IAspectConfiguration提供Interceptors注册全局拦截器:
services.ConfigureDynamicProxy(config=> {
config.Interceptors.AddTyped<CustomInterceptorAttribute>();
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
return services.BuildAspectInjectorProvider();
}
作为服务的全局拦截器。在ConfigureServices中添加:
services.AddTransient<CustomInterceptorAttribute>(provider => new CustomInterceptorAttribute());
作用于特定Service或Method的全局拦截器,下面的代码演示了作用于带有Service后缀的类的全局拦截器:
services.ConfigureDynamicProxy(config =>
{
config.Interceptors.AddTyped<CustomInterceptorAttribute>(method => method.DeclaringType.Name.EndsWith("Service"));
});
通配符拦截器,匹配后缀为Service
services.ConfigureDynamicProxy(config =>
{
config.Interceptors.AddTyped<CustomInterceptorAttribute>(Predicates.ForService("*Service"));
});
在AspectCore中提供NonAspectAttribute来使得Service或Method不被代理:
[NonAspect]
DateTime GetDate();
全局配置忽略条件
services.ConfigureDynamicProxy(config =>
{
//Namespace命名空间下的Service不会被代理
config.NonAspectPredicates.AddNamespace("Namespace");
//最后一级为Namespace的命名空间下的Service不会被代理
config.NonAspectPredicates.AddNamespace("*.Namespace");
//ICustomService接口不会被代理
config.NonAspectPredicates.AddService("ICustomService");
//后缀为Service的接口和类不会被代理
config.NonAspectPredicates.AddService("*Service");
//命名为Method的方法不会被代理
config.NonAspectPredicates.AddMethod("Method");
//后缀为Method的方法不会被代理
config.NonAspectPredicates.AddMethod("*Method");
});
AspectCore: [https://github.com/dotnetcore/AspectCore-Framework]
测试项目地址: [https://github.com/fhcodegit/DotNetAspectCore/tree/master]
dotnetcore实现Aop的更多相关文章
- Asp.Net Core轻量级Aop解决方案:AspectCore
什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) ...
- AOP in dotnet :AspectCore的参数拦截支持
距离上一篇AspectCore的介绍发布已经很长一段时间了,这篇文章也早该和大家见面,最近一直忙于适应新工作,并在业余时间有幸向何镇汐,Savorboard,农夫,AlexLEWIS等几位大牛请教学习 ...
- ASP.NET Core 2.1的配置、AOP、缓存、部署、ORM、进程守护、Nginx、Polly【源码】
ps:废话不多说.直接上代码:源码地址:https://github.com/786744873/Asp.Net-Core-2.1-All-Demos/tree/master/src Configur ...
- (6).NET CORE微服务 Micro-Service ---- AOP框架
AOP 框架基础 要求懂的知识:AOP.Filter.反射(Attribute). 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码.我们使用 AOP (如果不了解 AOP,请自 ...
- (6)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- AOP框架
AOP 框架基础 要求懂的知识:AOP.Filter.反射(Attribute). 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码.我们使用 AOP (如果不了解 AOP,请自 ...
- .net core系列之《对AOP思想的理解及使用AspectCore实现自定义日志拦截》
对于AOP这个名词,相信对于搞过MVC开发的人来说,都很熟悉,里面各种各样的Filter简直是将AOP体现到了极致. 那么什么是AOP呢? AOP(Aspect Oriented Programmin ...
- DispatchProxy实现动态代理及AOP
DispatchProxy类是DotnetCore下的动态代理的类,源码地址:Github,官方文档:MSDN.主要是Activator以及AssemblyBuilder来实现的(请看源码分析),园子 ...
- .NET Core IOC AOP
IOC简介 IOC思想 把类当做组件或服务来看待,组件内一定要高内聚,组件之间一定要低耦合,既然要保持低耦合,那就一定不要轻易的去new什么对象. 那组件之间的交互怎么处理呢?那最好的方式就是把new ...
- .NET 下基于动态代理的 AOP 框架实现揭秘
.NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihan ...
随机推荐
- Java_map的key为自定义对象
首先自定义Key对象 import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import java ...
- make && make install的区别
./configure 配置环境make 是编译的意思.就是把源码包编译成二进制可执行文件make install 就是安装的意思. make && make install 的意思是 ...
- 第一个月.day1
1. 编辑器下载 推荐的是hbulider 开发环境 2. 浏览器 推荐chrome 谷歌浏览器学习 3. 建立技术笔记 推荐博客园 Web 本月任务 搭建静态网页. 静态页面:不需要网络请求 ...
- 03-MySQL安装与配置
一.安装MySQL 1.我的是centos8,因此命令为: sudo yum install mysql-server 2.安装完成后查看是否启动 ps aux|grep mysql 3.启动mysq ...
- PalletOne调色板跨链的ETH提币实现
实现区块链的跨链,最主要的诉求就是Token的转移,而Token的跨链转移又分为充币和提币2种操作.以PalletOne调色板来说,如果要把ETH跨链到PalletOne上来流转,就是ETH的充币操作 ...
- Python 从入门到进阶之路(七)
之前的文章我们简单介绍了一下 Python 中异常处理,本篇文章我们来看一下 Python 中 is 和 == 的区别及深拷贝和浅拷贝. 我们先来看一下在 Python 中的双等号 == . == 是 ...
- JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载
最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...
- 使用Jitpack发布自己的Android Library
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/169 使用Jitpack发布自己的Android Libr ...
- NFS共享储存
目录 NFS 为什么要使用共享存储 集群没有共享存储的情况 集群有共享存储 NFS的工作原理 NFS部署 1.环境准备 2.关闭防火墙和selinux 3.部署nfs服务端 4.启动rpcbind 5 ...
- PyCharm关闭按两次Shift进入搜索框的功能
1.按Ctrl + Shift + A 弹出搜索框 2.在弹出的搜索框内输入registry(如果汉化了输入“注册”),回车 3.在弹出的窗口中,往下找到“ide.suppress.double.cl ...