.netcore 中使用开源的AOP框架 AspectCore
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支持(Middleware和Filter都是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环境
上面是一些概念介绍,关于AOP指的是面向切面编辑,其时我们之前用过,只是没注意而已,比如.netcore中的services中的方法,注入到服务中,权限过滤等都可以理解为AOP.
下面使用aspectcore写一个注入的例子,可以应用到验证权限中。
- 首先创建一个.netcore api项目,使用nuget添加AspectCore.Core、AspectCore.Extensions.DependencyInjection包的引用,我两个用的是1.2.0版本

- 创建自定义属性类,继承自AbstractInterceptorAttribute
using AspectCore.DynamicProxy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace AspectCore
{
public class CustomInterceptorAttribute: AbstractInterceptorAttribute
{
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");
}
} }
}
- 创建service类,添加属性过滤
using AspectCore.DynamicProxy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace AspectCore.Services
{ public interface ICustomService
{
[CustomInterceptor]
void Call();
}
public class CustomService : ICustomService
{
public void Call()
{
Console.WriteLine("service calling...");
}
}
}
- 创建Home控制器,添加测试Action
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AspectCore.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; namespace AspectCore.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{ private readonly ICustomService _service;
public HomeController(ICustomService service)
{
_service = service;
} [HttpGet("getmsg")]
public void GetMsg()
{ _service.Call();
} }
}
- 在startup中注入服务,主要是ConfigureServices中做了修改
using System;
using AspectCore.Configuration;
using AspectCore.Extensions.DependencyInjection;
using AspectCore.Injector;
using AspectCore.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; namespace AspectCore
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//根据属性注入来配置全局拦截器
services.ConfigureDynamicProxy(config =>
{
config.Interceptors.AddTyped<CustomInterceptorAttribute>();//CustomInterceptorAttribute这个是需要全局拦截的拦截器
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); ; services.AddSingleton<ICustomService, CustomService>(); var serviceContainer = services.ToServiceContainer();//容器
return serviceContainer.Build(); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
} app.UseHttpsRedirection();
app.UseMvc();
}
}
}
- 最后运行项目,即可查看运行结果,网上有的说只能调用Control中Action方法为virtual方法才能成功,其实是错误的。
- 目录结构如下

.netcore 中使用开源的AOP框架 AspectCore的更多相关文章
- 带你学习AOP框架之Aspect.Core[1]
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的 ...
- 在netcore中如何注入同一个接口的多个实现
netcore中自带了Ioc框架,这也影响了我们的编码习惯,以前都是静态类或者直接new对象,现在有了Ioc框架的支持,我们也不必守旧,应当使用起来,接受这种对象管理方式.使用过java的同仁,都习惯 ...
- Castle框架中的IOC和AOP机制
反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...
- 开源物联网通讯框架ServerSuperIO,成功移植到Windows10 IOT,在物联网和集成系统建设中降低成本。附:“物联网”交流大纲
[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 一.概述 经过一个多月晚上的时间,终于把开源物联网通讯框架ServerSuperIO成功移植到Windows10 IOT上, ...
- Android中使用开源框架android-image-indicator实现图片轮播部署
之前的博文中有介绍关于图片轮播的实现方式,分别为(含超链接): 1.<Android中使用ViewFlipper实现屏幕切换> 2.<Android中使用ViewPager实现屏幕页 ...
- Asp.NetCore 中Aop的应用
前言 其实好多项目中,做一些数据拦截.数据缓存都有Aop的概念,只是实现方式不一样:之前大家可能都会利用过滤器来实现Aop的功能,如果是Asp.NetCore的话,也可能会使用中间件: 而这种实现方式 ...
- Android平台免Root无侵入AOP框架Dexposed使用详解
Dexposed是基于久负盛名的开源Xposed框架实现的一个Android平台上功能强大的无侵入式运行时AOP框架. Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器,编织器或者 ...
- 二十七(序幕)、【开源】EFW框架破茧成蝶
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
- [Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍
AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect- ...
随机推荐
- IT兄弟连 HTML5教程 响应式网站的内容设计
基于响应式开发网站,除了页面的布局是我们设计的重点,网站中显示的图片和文字也是我们不能轻视的内容. 1 响应式图片显示内容设计 真正具有响应性的Web设计是完全调整网站以满足访问者的设备.我们需要在 ...
- 多个 .NET 框架
目录 应用程序编程接口 C# 和 .NET 版本控制 .NET Standard 目前存在多个 .NET 框架. Microsoft 的宗旨是在最大范围的操作系统和硬件平台上提供 .NET 实现. 下 ...
- git项目创建及在idea工具中使用
1.安装git管理工具 2.在自己github账号上创建一个项目仓库,比如我创建的是renrenView 网页翻译如下: 参数解析如下: 3.本地项目同步到远程仓库步骤 在本地初始化git项目 git ...
- Visual Studio中相对路径中的宏定义
$(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的值.有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置. $(References) 以分号分隔的引用列表被添加到 ...
- 计算机组成原理——输入输出(I/O)系统考研题
(一) I/O系统基本概念 (二) 外部设备 1. 输入设备:键盘.鼠标2. 输出设备:显示器.打印机3. 外存储器:硬盘存储器.磁盘阵列.光盘存储器 (三) I/ ...
- 【译】ModSecurity
Preface 本篇译ModSecurity 主页的自身介绍. ModSecurity is an open source, cross-platform web application firewa ...
- C# ling to sql 取多条记录最大时间
var _setList = (from f in _postgreDbContext.settlements group f by ( new { f.settlement_code })into ...
- 三大框架知识点比较(Angular, Vue, React)
点击左键 => 拖拽图片 => 新标签页查看图片 => 放大拖拽查阅
- java基础学习笔记 第二周(面向对象)
Day01 什么是抽象数据类型:将不同数据类型的集合组成的一个整体,我们称为抽象数据类型 类就是一个抽象数据类型 成员变量:类中的数据类型就是成员变量(属性) 方法:类中的一些行为就是方法 面向过程( ...
- 微店APP协议简要分析
1.通过抓包软件charles进行抓包,点击微信收款后,抓包内容都是加密处理过 2.加载分析定位这些字段的加密函数. WDTNThorParameterProcessor HTTPBody:task ...