AOP in dotnet :AspectCore的参数拦截支持
来源:互联网 发布:得力考勤机删除数据 编辑:程序博客网 时间:2024/06/05 19:29
距离上一篇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的参数拦截支持
- AOP in dotnet :AspectCore的参数拦截支持
- 推荐最新的Asp.Net Core 下开源的AOP框架 AspectCore
- Asp.Net Core轻量级Aop解决方案:AspectCore
- Spring AOP Maven依赖,拦截加注解的方法参数
- DotNet对同步的支持
- spring aop拦截Controller做参数校验
- Spring In Action读书笔记之五------------------AOP的参数传递
- [Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍
- spring AOP的异常拦截
- spring AOP的异常拦截
- spring AOP的异常拦截
- spring AOP的异常拦截
- spring的aop拦截器
- spring AOP的异常拦截
- SpringMVC的AOP拦截controller
- 使用 aop拦截 springMVC的controller并获取请求参数及返回结果
- Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理
- Health Check in eShop -- 解析微软微服务架构Demo(五)
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
- 我眼中的ASP.NET Core之微服务
- 微服务中的异步消息通讯
- .NET Core 事件总线,分布式事务解决方案:CAP
- AOP in dotnet :AspectCore的参数拦截支持
- NavigationView的点击事件失效原因和解决方案
- .NET Core快速入门教程 4、使用VS Code开发.NET Core控制台应用程序
- ASP.NET Core MVC 过滤器介绍
- Autofac+Castle实现AOP事务
- .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
- .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)
- ASP.NET Core 开源论坛项目 NETCoreBBS
- docker学习之-docker mac安装