AOP in dotnet :AspectCore的参数拦截支持
距离上一篇AspectCore的介绍发布已经很长一段时间了,这篇文章也早该和大家见面,最近一直忙于适应新工作,并在业余时间有幸向何镇汐,Savorboard,农夫,AlexLEWIS等几位大牛请教学习,收获颇多。另一方面,一直在对AspectCore进行重构,并把AspectCore从AspectCore Project迁移到.NET China Foundation(前身为AspNetCore文档翻译小组),由我和 DotNetCore 项目组共同维护。下面言归正传,一起来看一下AspectCore给大家带来的新特性。
AspectCore 0.1.2-release
AspectCore v0.1.2已经正式发布,相对于前一个版本,V0.1.2中除了修复诺干bug外,最重要的特性就是带了方法参数拦截器和方法参数注入的支持。
参数拦截器
我们先来看下面的方法:
public class AppService : IAppService
{
public void Run(string[] args)
{
if (args == null)
{
throw new ArgumentNullException(nameof(args));
}
// todo..
}
}
在开发中,对方法的输入参数进行非空校验是一个不错的编程习惯,可以避免意外的抛出NullReferenceException,但对于所有方法的参数都进行如上的手动验证的话,又是一个很耗费人力的事情。那么能不能只在参数上标记自定义的特性,让框架来帮助我们进行自动的参数验证呢?比如下面的代码:
public void Run([NotNull]string[] args)
{
//todo..
}
接下来,让我们来看看AspectCore是怎么做的吧。
新建.net core的ConsoleApp项目,添加AspectCore的nuget packages:
PM> Install-Package AspectCore.Extensions.DependencyInjection PM> Install-Package AspectCore.Extensions.CrossParameters在Main方法中添加:
public class Program { public static void Main(string[] args) { IServiceCollection services = new ServiceCollection(); services.AddAspectCore(options => { options.AddMethodInject(); options.AddParameterIntercept(); }); services.AddTransient<IAppService, AppService>(); services.AddTransient<IAppLifetime, AppLifetime>(); IServiceProvider aspectCoreServiceProvider = services.BuildAspectCoreServiceProvider(); Console.ReadKey(); } }参数拦截器定义在
AspectCore.Extensions.CrossParameters命名空间下,并已经内置NotNullAttribute进行非空验证,我们来通过继承ParameterInterceptorAttribute来自定义另一个参数拦截器NotNullOrEmptyAttribute:public class NotNullOrEmptyAttribute : ParameterInterceptorAttribute { public override Task Invoke(IParameterDescriptor parameter, ParameterAspectContext context, ParameterAspectDelegate next) { if (parameter.ParameterType == typeof(string)) { if (string.IsNullOrEmpty(parameter.Value?.ToString())) { throw new ArgumentException($"Invalid parameter. {parameter.Name} cannot be null or empty"); } } return next(parameter, context); } }定义需要进行参数拦截的方法:
public interface IAppService { void Run([NotNull]string[] args); void Stop([NotNullOrEmpty]string message); //.. }通过AspectCore创建的类型实例便能在运行时对标记了特性的方法参数进行拦截验证。
方法参数注入
在Asp.Net Core MVC中我们通过在Action的参数上标记[FromServices]来进行参数注入。那么在非Controller类和非Action方法中,我们同样可以通过AspectCore完成类似的功能。
定义如下方法:
public interface IAppService
{
Lifetime GetLifetime([Inject]IAppLifetime lifetime = null);
}
那么我们可以在调用时:
var appService = aspectCoreServiceProvider.GetService<IAppService>();
appService.GetLifetime();
参数IAppLifetime lifetime便会自动在运行时注入到方法中。
本文是示例代码在AspectCore/Sample。
AspectCore的后续计划
AspectCore 正式更名为 AspectCore Framework,旨在提供以AOP为核心的跨平台开发框架,正在开发的版本定义为v0.2-preview1,在这个版本中,我们会添加如下基础组件:
- AspectCore.Extensions.Reflection : 高性能的反射扩展
- AspectCore.Extensions.Expression : 表达式树和Emit扩展
- AspectCore.Extensions.Mapper : 轻量级对象映射库
- AspectCore.Extensions.DataValidations : 服务层方法的数据验证组件
- AspectCore.Extensions.CrossProperties : 属性拦截器
有问题反馈
如果您有任何想法或建议,欢迎提交Issues给我们。
欢迎加入
- 如果您对AspectCore Framework感兴趣或者想对.net core做出贡献,都欢迎您加入 AspectCore Framework 或 .NET China Foundation下的任何其他项目。
- 如果您有优秀的.net core开源项目,也欢迎项目加入 .NET China Foundation。
- 现在是.net core开源最好的时代,让我们一起为.net core贡献自己的一份力量吧!
AOP in dotnet :AspectCore的参数拦截支持的更多相关文章
- Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理
Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理 本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 ...
- .Net中的AOP系列之《间接调用——拦截方法》
返回<.Net中的AOP>系列学习总目录 本篇目录 方法拦截 PostSharp方法拦截 Castle DynamicProxy方法拦截 现实案例--数据事务 现实案例--线程 .Net线 ...
- 我心中的核心组件(可插拔的AOP)~第四回 异常拦截器
回到目录 之前说过有关拦截器的文章,第二回 缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interceptio ...
- 错误“Sources”参数中指定了多次。“Sources”参数不支持重复项。
在“Sources”参数中指定了项“”多次.“Sources”参数不支持重复项. Asp.Net关于错误“Sources”参数中指定了多次.“Sources”参数不支持重复项. “Sources”参数 ...
- Asp.net Core 3.1基于AspectCore实现AOP,实现事务、缓存拦截器
最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理.给一个方法加一个缓存特性,那这个方法就会进行缓存. 这个也是网上说的面向切面编程AOP. ...
- Asp.Net Core轻量级Aop解决方案:AspectCore
什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) ...
- C# AOP 面向切面编程之 调用拦截
有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...
- spring boot: filter/interceptor/aop在获取request/method参数上的区别(spring boot 2.3.1)
一,filter/interceptor/aop在获取参数上有什么区别? 1,filter可以修改HttpServletRequest的参数(doFilter方法的功能), interceptor/a ...
- 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
随机推荐
- 将数据的初始化放到docker中的整个工作过程(问题记录)
将数据的初始化放到docker中的整个工作过程 由于是打算作为个人博客,所以对于install这个步骤,我从一开始就打算删掉的,前面一个多星期一直在修bug,到前天才开始做这个事情. 过程中也是碰到了 ...
- openjdk7之编译和debug
大家也可以看我的博客: openjdk7之编译和debug,这里格式更好. 为了更好的学习JDK.HotSpot等源码,需要能debug JDK.HotSpot等源码.本文主要讲述,怎么编译open ...
- spring非controller类获取service方法
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); pushMessageServ ...
- js获取网页请求类型是http还是https
代码如下,即可判断 var ishttps = 'https:' == document.location.protocol ? true : false; if(ishttps) { alert(& ...
- 导入网页数据到 Google Sheet
数据没有用,我们需要的是数据所反映出来的东西.增长率,排名,占比等.而这些结果是通过分析数据得到的. 从网上搜集到数据后,导入到表格程序中便可以进行方便地分析处理了.下面介绍将网页中的表格数据导入到 ...
- shell脚本调用C语言之字符串切分之strtok函数
今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...
- canvas学习总结三:绘制虚线
上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...
- 类型转换之 PropertyEditorSupport类
这个类可以用于自定义的类型转换, 子类继承这个类之后可以重写子类的方法 ,其中比较重要的是setAsText和setValue方法,setAsText 子自己的方式处理转换,setValue将转换的结 ...
- Socket实现
网络实现架构 4.4BSD通过同时对多种通信协议的支持来提供通用的底层基础服务.4.4BSD支持四种不同的通信协议簇: TCP/IP(互联网协议簇) XNS(Xerox网络系统) OSI协议 Unix ...
- 《HelloGitHub》第 15 期
公告 这段时间没怎么写文章,跑去写 https://hellogithub.com 这个网站了,现在已经顺利上线,功能后面会持续迭代. 最后,这个 https://hellogithub.com 网站 ...