什么是AspectCore Project ?

什么是AspectCore Project ?

aspectcore project 是适用于asp.net core 平台的轻量级 aop(aspect-oriented programming) 解决方案,它更好的遵循asp.net core的模块化开发理念,使用aspectcore可以更容易构建低耦合、易扩展的web应用程序。aspectcore使用emit实现高效的动态代理从而不依赖任何第三方aop库。

开使使用AspectCore

启动 Visual Studio。从 File 菜单, 选择 New > Project。选择 ASP.NET Core Web Application 项目模版,创建新的 ASP.NET Core Web Application 项目。

从 Nuget 安装 AspectCore.Extensions.DependencyInjection package:

PM>   Install-Package AspectCore.Extensions.DependencyInjection

登录后复制

在一般情况下可以使用抽象的InterceptorAttribute自定义特性类,它实现IInterceptor接口。AspectCore默认实现了基于Attribute的拦截器配置。我们的自定义拦截器看起来像下面这样:

public class CustomInterceptorAttribute : InterceptorAttribute{    public async override Task Invoke(IAspectContext context, AspectDelegate next)    {        try        {            Console.WriteLine("Before service call");            await next(context);        }        catch (Exception)        {            Console.WriteLine("Service threw an exception!");            throw;        }        finally        {            Console.WriteLine("After service call");        }     } }

登录后复制

定义ICustomService接口和它的实现类CustomService:

public interface ICustomService{    [CustomInterceptor]    void Call();}public class CustomService : ICustomService{    public void Call()    {        Console.WriteLine("service calling...");    }}

登录后复制

在HomeController中注入ICustomService:

public class HomeController : Controller{    private readonly ICustomService _service;    public HomeController(ICustomService service)    {        _service = service;    }    public IActionResult Index()    {        _service.Call();        return View();    }}

登录后复制

注册ICustomService,接着,在ConfigureServices中配置创建代理类型的容器:

public IServiceProvider ConfigureServices(IServiceCollection services){    services.AddTransient();    services.AddMvc();    services.AddAspectCore();    return services.BuildAspectCoreServiceProvider();}

登录后复制

拦截器配置。首先安装AspectCore.Extensions.Configuration package:

PM> Install-Package AspectCore.Extensions.Configuration

登录后复制

全局拦截器。使用AddAspectCore(Action)的重载方法,其中AspectCoreOptions提供InterceptorFactories注册全局拦截器:

 services.AddAspectCore(config => {      config.InterceptorFactories.AddTyped(); });

登录后复制

带构造器参数的全局拦截器,在CustomInterceptorAttribute中添加带参数的构造器:

public class CustomInterceptorAttribute : InterceptorAttribute{    private readonly string _name;    public CustomInterceptorAttribute(string name)    {        _name = name;    }    public async override Task Invoke(AspectContext context, AspectDelegate next)    {        try        {            Console.WriteLine("Before service call");            await next(context);        }        catch (Exception)        {            Console.WriteLine("Service threw an exception!");            throw;        }        finally        {            Console.WriteLine("After service call");        }    }}

登录后复制

修改全局拦截器注册:

services.AddAspectCore(config =>{     config.InterceptorFactories.AddTyped(args: new object[] { "custom" });});

登录后复制

作为服务的全局拦截器。在ConfigureServices中添加:

services.AddTransient(provider => new CustomInterceptorAttribute("service"));

登录后复制

修改全局拦截器注册:

services.AddAspectCore(config =>{    config.InterceptorFactories.AddServiced();});

登录后复制

作用于特定Service或Method的全局拦截器,下面的代码演示了作用于带有Service后缀的类的全局拦截器:

services.AddAspectCore(config =>{    config.InterceptorFactories.AddTyped(method => method.DeclaringType.Name.EndsWith("Service"));});

登录后复制

使用通配符的特定全局拦截器:

services.AddAspectCore(config =>{    config.InterceptorFactories.AddTyped(PredicateFactory.ForService("*Service"));});

登录后复制

在AspectCore中提供NonAspectAttribute来使得Service或Method不被代理:

[NonAspect]public interface ICustomService{    void Call();}

登录后复制

同时支持全局忽略配置,亦支持通配符:

 services.AddAspectCore(config =>  {      //App1命名空间下的Service不会被代理      config.NonAspectOptions.AddNamespace("App1");      //最后一级为App1的命名空间下的Service不会被代理      config.NonAspectOptions.AddNamespace("*.App1");      //ICustomService接口不会被代理      config.NonAspectOptions.AddService("ICustomService");      //后缀为Service的接口和类不会被代理      config.NonAspectOptions.AddService("*Service");      //命名为Query的方法不会被代理      config.NonAspectOptions.AddMethod("Query");      //后缀为Query的方法不会被代理      config.NonAspectOptions.AddMethod("*Query");  });

登录后复制

拦截器中的依赖注入。在拦截器中支持属性注入,构造器注入和服务定位器模式。
属性注入,在拦截器中拥有public get and set权限的属性标记[AspectCore.Abstractions.FromServices](区别于Microsoft.AspNetCore.Mvc.FromServices)特性,即可自动注入该属性,如:

public class CustomInterceptorAttribute : InterceptorAttribute{    [AspectCore.Abstractions.FromServices]    public ILogger Logger { get; set; }    public override Task Invoke(AspectContext context, AspectDelegate next)    {        Logger.LogInformation("call interceptor");        return next(context);    }}

登录后复制

构造器注入需要使拦截器作为Service,除全局拦截器外,仍可使用ServiceInterceptor使拦截器从DI中激活:

public interface ICustomService{    [ServiceInterceptor(typeof(CustomInterceptorAttribute))]    void Call();}

登录后复制

服务定位器模式。拦截器上下文AspectContext可以获取当前Scoped的ServiceProvider:

public class CustomInterceptorAttribute : InterceptorAttribute{    public override Task Invoke(AspectContext context, AspectDelegate next)    {        var logger = context.ServiceProvider.GetService<ILogger>();        logger.LogInformation("call interceptor");        return next(context);    }}

登录后复制

使用Autofac和AspectCore。AspectCore原生支持集成Autofac,我们需要安装下面两个nuget packages:

PM> Install-Package Autofac.Extensions.DependencyInjectionPM> Install-Package AspectCore.Extensions.Autofac

登录后复制

AspectCore提供RegisterAspectCore扩展方法在Autofac的Container中注册动态代理需要的服务,并提供AsInterfacesProxy和AsClassProxy扩展方法启用interface和class的代理。修改ConfigureServices方法为:

public IServiceProvider ConfigureServices(IServiceCollection services){    services.AddMvc();    var container = new ContainerBuilder();    container.RegisterAspectCore();    container.Populate(services);    container.RegisterType().As().InstancePerDependency().AsInterfacesProxy();    return new AutofacServiceProvider(container.Build());}

登录后复制

有问题反馈

如果您有任何问题,请提交 Issue 给我们。
AspectCore Project 项目地址:

最后。。。

正在找工作,欢迎推荐.NET/.NET Core后端开发职位,坐标上海,可私信或Email。

以上就是什么是AspectCore Project ?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2440228.html

(0)
上一篇 2025年3月3日 12:21:24
下一篇 2025年3月3日 02:19:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 分享一个磁盘文件查看系统

    本篇和大家分享的是一个磁盘文件查看系统,严格来说是使用NetCore写的一个Web系统应用,由于NetCore跨平台特性,我生成了exe的运行包,只需要配置运行电脑ip+端口,即可在浏览器中通过IP+端口的方式访问目标调用上的所有目录,不错…

    2025年3月3日 编程技术
    200
  • 学习ASP.NET Core 2遇到的问题分享

    .  net core 从2016年6月28日发布,过去了将近一年的时间,但是在工作中发现大家对.net core的接受程度并不高,这只是一个感觉,俗话说“没有调查就没有发言权”, 这两天通过微信小程序在微信群里做了一个调查,参与的人数大概…

    2025年3月3日
    200
  • ASP.NET Core 应用程序发布命令实例

    asp.net core 应用程序发布命令: dotnet publish [] [-f|–framework] [-r|–runtime] [-o|–output] [-c|–configuration] [–version-s…

    2025年3月3日
    200
  • 使用Action的模型绑定实例教程

    在qq群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在action中接收、我传的数组为什么action的model中接收不到、或者我在ajax的data中设置了一些数组,为什么后台还是接收不了、还有一些怎么传送一个复杂的对象或者a…

    2025年3月3日 编程技术
    200
  • Asp.net MVC 对用户输入的字符串做Trim处理的方法实例

    这篇文章主要介绍了asp.net mvc 如何对所有用户输入的字符串字段做trim处理,需要的朋友可以参考下 经常需要对用户输入的数据在插入数据库或者判断之前做Trim处理,针对每个ViewModel的字段各自做处理是我们一般的想法。最近调…

    2025年3月3日 编程技术
    200
  • 详细介绍ASP.NET Core静态文件的使用教程

    这篇文章主要为大家详细介绍了asp.net core静态文件的使用教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在这一章,我们将学习如何使用文件。几乎每个web应用程序都需要一个重要特性:能够从文件系统提供文件(静态文件)。 静态…

    2025年3月3日 编程技术
    200
  • 简单使用的ASP.NET验证码实例代码

    这篇文章主要为大家详细介绍了一个简单的asp.net验证码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了ASP.NET验证码的具体代码,供大家参考,具体内容如下 我主要是看到干扰线了,一个验证码里面要是没有干扰线什…

    编程技术 2025年3月3日
    200
  • 理解Asp.Net中WebForm的生命周期_实用技巧

    这篇文章主要给大家介绍了关于asp.net中webform生命周期的相关资料,文中介绍的非常星系,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。 前言 本文主要给大家介绍的是关于Asp.Net中WebForm生命周…

    编程技术 2025年3月3日
    200
  • Asp.net MVC 对输入的字符串字段做Trim处理的方法_实用技巧

    这篇文章主要介绍了asp.net mvc 如何对所有用户输入的字符串字段做trim处理,需要的朋友可以参考下 经常需要对用户输入的数据在插入数据库或者判断之前做Trim处理,针对每个ViewModel的字段各自做处理是我们一般的想法。最近调…

    2025年3月3日 编程技术
    200
  • ASP.NET Core使用教程(9)_实用技巧

    这篇文章主要为大家详细介绍了asp.net core静态文件的使用教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在这一章,我们将学习如何使用文件。几乎每个web应用程序都需要一个重要特性:能够从文件系统提供文件(静态文件)。 静态…

    2025年3月3日 编程技术
    200

发表回复

登录后才能评论