[Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍

AspectCore Project 介绍

什么是AspectCore Project ?

AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) 解决方案,它更好的遵循Asp.Net Core的模块化开发理念,使用AspectCore可以更容易构建低耦合、易扩展的Web应用程序。

为什么要设计AspectCore ?

在传统.Net Framework和Asp.Net Framework中,我们使用Castle DynamicProxy 或者CLR提供的 Remoting.Proxies 可以轻松的实现 Aop 来分离关注点从而降低业务逻辑和基础框架功能的耦合。然而在Asp.Net Core中,不仅缺乏细粒度的Aop支持(MiddlewareFilter都是Asp.Net Core的内置Aop实现,但仅适合在Web层使用),Castle也迟迟未能友好的支持Asp.Net Core。

因此 AspectCore 提供了一个全新的轻量级和模块化的Aop解决方案,下面是AspectCore的基本特性:

  • 提供抽象的Aop接口,基于该接口,可以轻松的使用自己的代理类实现替换默认的实现

  • 框架不包含IoC,也不依赖具体的IoC实现,可以使用Asp.Net Core的内置依赖注入或任何兼容 Asp.Net Core的第三方IoC来集成 AspectCore 到 Asp.Net Core 应用程序中

  • 高性能的异步拦截器系统

  • 灵活的配置系统

  • 基于Service的而非基于实现类的切面构造

  • 支持跨平台的Asp.Net Core环境

AspectCore Project 架构设计

从上图可以看出,AspectCore Abstractions 是AspectCore Project的核心,向下通过IoC来集成到Asp.Net Core应用程序中,向上提供配置系统,动态代理系统,模型验证系统以及更多的扩展系统。

目前已完成的组件包括:

  • AspectCore.Lite.Abstractions 提供Aop的抽象接口

  • AspectCore.Lite.Abstractions.Resolution 默认的Aop实现

  • AspectCore.Lite.Container.DependencyInjection AspectCore的DependencyInjection支持

  • AspectCore.Lite.Container.Autofac AspectCore的Autofac支持

在Asp.Net Core应用程序中开始使用AspectCore

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

  2. 从 Nuget 安装 AspectCore.Lite.Container.DependencyInjection package:

    PM> Install-Package AspectCore.Lite.Container.DependencyInjection -Pre

    在拦截器系统中,AspectCore定义了IInterceptor接口,它声明了一个返回值为Task的异步执行方法:

    namespace AspectCore.Lite.Abstractions{public interface IInterceptor{    Task Invoke(IAspectContext context, AspectDelegate next);
    }
    }

    然而在一般情况下可以使用另一个抽象的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");
        }
     }
    }
  3. 定义ICustomService接口和它的实现类CustomService:

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

    public class HomeController : Controller{
    private readonly ICustomService _service;
    public HomeController(ICustomService service){
        _service = service;
    }public IActionResult Index(){
        _service.Call();    return View();
    }
    }
  5. 注册ICustomService,接着,在ConfigureServices中配置创建代理类型的容器:

    public IServiceProvider ConfigureServices(IServiceCollection services){
    services.AddTransient<ICustomService, CustomService>();
    services.AddMvc();
    return new AspectCoreServiceProviderFactory().CreateServiceProvider(services);
    }

    有问题反馈

    如果您有任何问题,请提交 Issue 给我们。
    AspectCore Project 项目地址: https://github.com/aspectcore
    AspectCore Project 文档地址: https://docs.aspectcore.org(文档在持续更新中..)

原文地址:http://www.cnblogs.com/liuhaoyang/p/aspectcore-introduction.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值