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.DependencyInjectionPM> 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给我们。
QQ群 dotNET Core Studying Group : 436035237
欢迎加入
如果您对AspectCore Framework感兴趣或者想对.net core做出贡献,都欢迎您加入 AspectCore Framework 或 .NET China Foundation下的任何其他项目。
如果您有优秀的.net core开源项目,也欢迎项目加入 .NET China Foundation。
现在是.net core开源最好的时代,让我们一起为.net core贡献自己的一份力量吧!
相关文章:
[Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍
Asp.Net Core轻量级Aop解决方案:AspectCore
原文地址:http://www.cnblogs.com/liuhaoyang/p/aspectcore-crossparameters.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
AOP in dotnet :AspectCore的参数拦截支持相关推荐
- spring拦截器传递传递参数到controller+Aop切面环绕方法传递参数到目标方法
一.前言 由于业务需要,在网上找了很久得到了这两种方式.本文代码偏少,主要讲解一下怎么传,如何接收,也记录一下,以便之后查看. 二.Spring拦截器传递参数到controller 下面是我拦截器中的 ...
- aop对请求后端的参数修改_Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理...
对于spring框架来说,最重要的两大特性就是AOP 和IOC. 以前一直都知道有这两个东西,在平时做的项目中也常常会涉及到这两块,像spring的事务管理什么的,在看了些源码后,才知道原来事务管理也 ...
- Asp.Net Core轻量级Aop解决方案:AspectCore
什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) ...
- Spring Boot【定制化】~ AOP统一结果处理以及异常拦截
1.简介 用处:统一结果处理与异常拦截. 2.配置步骤 2.1.创建一个spring boot项目(idea) 完整项目结构! 2.2.导入依赖(需要使用到简化环境搭建) <!-- Spring ...
- 【日志记录】基于AOP实现自定义日志注解,并支持动态设置注解内容
前言 平时在java项目开发过程中,涉及到记录操作日志的场景很多,有时候大家习惯把操作日志的生成代码写到业务代码中,这样造成了日志和业务代码的耦合性比较高.可维护性也不强,易读性更差,更多的时候是使用 ...
- Springboot AOP注解方式获取请求参数及返回值并发送至rabbitMQ
业务需求需要将http请求参数与返回值采集,考虑使用AOP形式,获取到请求值与返回值之后将数据封装为json字符串发送到rabbitMQ中,消费者消费数据后将处理后的数据保存至mongodb或其 ...
- aop对请求后端的参数修改_Spring Aop 修改目标方法参数和返回值
@Component("changeIdNoAopHandler")public classChangeIdNoAopHandler {private static Logger ...
- php 获取微信文章阅读量,获取微信公众号的文章的阅读数的实践(请求参数不支持文章 ID)...
1.新的需求为:需要实现微信渠道的文章的阅读数的显示.如图1 图1 2.实则最为理想的情况,应该是能够基于文章 ID 获取此文章的阅读数,就像抖音.查看抖音开放平台文档 – 资源中心 – Open A ...
- QT中使用 WinExec API 参数不支持中文路径的解决办法
在QT中使用WinExec时,发现如果调用外部程序,如果路径或者参数含有中文路径,可能导致无法打开应用程序或者无法使用参数,解决办法,下面是简单的解决办法: QString strImagePath ...
最新文章
- c语言知识点演讲,C语言实验复习资料讲课讲稿.doc
- redistemplate文档用法_Jedis 使用及 StringRedisTemplate 常用方法
- MySql采用range分区可提升查询效率
- 计算机无法屏幕亮度,我的电脑屏幕亮度无法调节了,品目很暗,求助
- quartus管脚分配后需要保存吗_掉电保存数据到EEPROM
- python对图片颜色校正_使用Python PIL更改图像色调
- 云计算:21世纪的商业平台
- exists sql用法_《SQL进阶教程》笔记(3)
- CridView创建 实现选中,编辑,取消,删除
- Photoshop插件-HDR(五)-脚本开发-PS插件
- 341编程器 软硬件
- 基于GraphQL的数据网关实现
- 服务器部署项目拓扑图,cdn服务器部署拓扑图
- linpack学习记录
- Clickhouse入门学习、单机、集群安装部署
- 百度、腾讯、滴滴,如何看2019智能网联汽车发展 | 2019互联网岳麓峰会...
- 正面管教php_正面管教php_我校开展正面管教家长工作坊分享会
- 《Python学习手册》读书笔记
- js拖拽俄罗斯方块小游戏(一)
- 二十六、rosbag功能包
热门文章
- Android渠道包自动化验证
- 嵌入式WiFi芯片价格战已经打响 MCU企业该醒悟了
- 云上“炼”码兵器 GitHub Codespaces
- c#屏幕录制(经典)(含源码和AForge.Video.FFMPEG.DLL)及填坑办法
- .NET 也有 Husky 了
- WPF DataGrid 通过自定义表头模拟首行固定
- 单元测试(二)基本使用争议篇
- 一秒创建高级查询服务
- Magicodes.IE 2.5.4.2发布
- C#-using与添加引用的关系