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());

作用于特定ServiceMethod的全局拦截器,下面的代码演示了作用于带有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来使得ServiceMethod不被代理:

   [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的更多相关文章

  1. Asp.Net Core轻量级Aop解决方案:AspectCore

    什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) ...

  2. AOP in dotnet :AspectCore的参数拦截支持

    距离上一篇AspectCore的介绍发布已经很长一段时间了,这篇文章也早该和大家见面,最近一直忙于适应新工作,并在业余时间有幸向何镇汐,Savorboard,农夫,AlexLEWIS等几位大牛请教学习 ...

  3. 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 ...

  4. (6).NET CORE微服务 Micro-Service ---- AOP框架

    AOP 框架基础 要求懂的知识:AOP.Filter.反射(Attribute). 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码.我们使用 AOP (如果不了解 AOP,请自 ...

  5. (6)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- AOP框架

    AOP 框架基础 要求懂的知识:AOP.Filter.反射(Attribute). 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码.我们使用 AOP (如果不了解 AOP,请自 ...

  6. .net core系列之《对AOP思想的理解及使用AspectCore实现自定义日志拦截》

    对于AOP这个名词,相信对于搞过MVC开发的人来说,都很熟悉,里面各种各样的Filter简直是将AOP体现到了极致. 那么什么是AOP呢? AOP(Aspect Oriented Programmin ...

  7. DispatchProxy实现动态代理及AOP

    DispatchProxy类是DotnetCore下的动态代理的类,源码地址:Github,官方文档:MSDN.主要是Activator以及AssemblyBuilder来实现的(请看源码分析),园子 ...

  8. .NET Core IOC AOP

    IOC简介 IOC思想 把类当做组件或服务来看待,组件内一定要高内聚,组件之间一定要低耦合,既然要保持低耦合,那就一定不要轻易的去new什么对象. 那组件之间的交互怎么处理呢?那最好的方式就是把new ...

  9. .NET 下基于动态代理的 AOP 框架实现揭秘

    .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihan ...

随机推荐

  1. Java_map的key为自定义对象

    首先自定义Key对象 import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import java ...

  2. make && make install的区别

    ./configure 配置环境make 是编译的意思.就是把源码包编译成二进制可执行文件make install 就是安装的意思. make && make install 的意思是 ...

  3. 第一个月.day1

    1. 编辑器下载 推荐的是hbulider     开发环境 2. 浏览器 推荐chrome 谷歌浏览器学习 3. 建立技术笔记 推荐博客园 Web 本月任务 搭建静态网页. 静态页面:不需要网络请求 ...

  4. 03-MySQL安装与配置

    一.安装MySQL 1.我的是centos8,因此命令为: sudo yum install mysql-server 2.安装完成后查看是否启动 ps aux|grep mysql 3.启动mysq ...

  5. PalletOne调色板跨链的ETH提币实现

    实现区块链的跨链,最主要的诉求就是Token的转移,而Token的跨链转移又分为充币和提币2种操作.以PalletOne调色板来说,如果要把ETH跨链到PalletOne上来流转,就是ETH的充币操作 ...

  6. Python 从入门到进阶之路(七)

    之前的文章我们简单介绍了一下 Python 中异常处理,本篇文章我们来看一下 Python 中 is 和 == 的区别及深拷贝和浅拷贝. 我们先来看一下在 Python 中的双等号 == . == 是 ...

  7. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...

  8. 使用Jitpack发布自己的Android Library

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/169 使用Jitpack发布自己的Android Libr ...

  9. NFS共享储存

    目录 NFS 为什么要使用共享存储 集群没有共享存储的情况 集群有共享存储 NFS的工作原理 NFS部署 1.环境准备 2.关闭防火墙和selinux 3.部署nfs服务端 4.启动rpcbind 5 ...

  10. PyCharm关闭按两次Shift进入搜索框的功能

    1.按Ctrl + Shift + A 弹出搜索框 2.在弹出的搜索框内输入registry(如果汉化了输入“注册”),回车 3.在弹出的窗口中,往下找到“ide.suppress.double.cl ...