距离上一篇AspectCore的介绍发布已经很长一段时间了,这篇文章也早该和大家见面,最近一直忙于适应新工作,并在业余时间有幸向何镇汐Savorboard农夫AlexLEWIS等几位大牛请教学习,收获颇多。另一方面,一直在对AspectCore进行重构,并把AspectCoreAspectCore 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是怎么做的吧。

  1. 新建.net core的ConsoleApp项目,添加AspectCore的nuget packages:

    PM> Install-Package AspectCore.Extensions.DependencyInjection
    PM> Install-Package AspectCore.Extensions.CrossParameters
  2. 在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();
        }
    }
    
  3. 参数拦截器定义在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);
        }
    }
  4. 定义需要进行参数拦截的方法:

    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的参数拦截支持的更多相关文章

  1. Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理

    Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理   本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 ...

  2. .Net中的AOP系列之《间接调用——拦截方法》

    返回<.Net中的AOP>系列学习总目录 本篇目录 方法拦截 PostSharp方法拦截 Castle DynamicProxy方法拦截 现实案例--数据事务 现实案例--线程 .Net线 ...

  3. 我心中的核心组件(可插拔的AOP)~第四回 异常拦截器

    回到目录 之前说过有关拦截器的文章,第二回  缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interceptio ...

  4. 错误“Sources”参数中指定了多次。“Sources”参数不支持重复项。

    在“Sources”参数中指定了项“”多次.“Sources”参数不支持重复项. Asp.Net关于错误“Sources”参数中指定了多次.“Sources”参数不支持重复项. “Sources”参数 ...

  5. Asp.net Core 3.1基于AspectCore实现AOP,实现事务、缓存拦截器

    最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理.给一个方法加一个缓存特性,那这个方法就会进行缓存. 这个也是网上说的面向切面编程AOP. ...

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

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

  7. C# AOP 面向切面编程之 调用拦截

    有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...

  8. spring boot: filter/interceptor/aop在获取request/method参数上的区别(spring boot 2.3.1)

    一,filter/interceptor/aop在获取参数上有什么区别? 1,filter可以修改HttpServletRequest的参数(doFilter方法的功能), interceptor/a ...

  9. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

随机推荐

  1. Navicat for mysql 11.1.20激活

    由于最近工作太忙,一直没有机会分享自己在工作中遇到的困难,今天周日,在出去之前先分享下navicat(版本很重要navicat_trial_11.1.20.0.1449226634)激活. 刚开始我是 ...

  2. 提高code效率

    分享下个人编码挫折,关于提高编码效率.代码规范.清晰的代码模块顺序.及时总结代码(提取出可复用的)以及清晰的注释,这是我感觉有必要的,因为工作到后期,代码量都非常的大.就是上个周5那天的整体工作效率都 ...

  3. 一天搞定CSS: 清除浮动(float)--13

    上一节已经说明了为什么要清除浮动了.这里我们就来解决浮动产生的各种问题. 为什么要清楚浮动? 地址:http://blog.csdn.net/baidu_37107022/article/detail ...

  4. 模板C++ 03图论算法 1最短路之单源最短路(SPFA)

    3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...

  5. 让Chrome看不了WWDC直播的HLS技术详解

    Requirements: Live streaming uses Apple's HTTP Live Streaming (HLS) technology. HLS requires an iPho ...

  6. 一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)

    前面我们已经讨论了容器的各种操作,对容器的生命周期有了大致的理解,下面这张状态机很好地总结了容器各种状态之间是如何转换的. 如果掌握了前面的知识,要看懂这张图应该不难.不过有两点还是需要补充一下: 可 ...

  7. Java开发中的23+2种设计模式学习个人笔记(未完待续)

    注:个人笔记 一.设计模式分三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模 ...

  8. oracle中的function的简单语法定义

    1. create or replace 函数名 (参数名 in 类型) return 返回值类型 as 定义变量 begin 函数体 end;

  9. php实现获取汉字的首字母

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  10. 编写高质量代码:改善Java程序的151个建议(第二章:基本类型)

    编写高质量代码:改善Java程序的151个建议(第二章:基本类型) 目录 建议21:用偶判断,不用奇判断 建议22:用整数类型处理货币 建议23:不要让类型默默转换 建议24:边界还是边界 建议25: ...