AspectCore Project 介紹 什麼是AspectCore Project ? "AspectCore Project" 是適用於 "Asp.Net Core" 平臺的輕量級 "Aop(Aspect oriented programming)" 解決方案,它更好的遵循Asp.Net Co ...
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環境
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
- 啟動 Visual Studio。從 File 菜單, 選擇 New > Project。選擇 ASP.NET Core Web Application 項目模版,創建新的 ASP.NET Core Web Application 項目。
從 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"); } } }
定義
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<ICustomService, CustomService>(); services.AddMvc(); return new AspectCoreServiceProviderFactory().CreateServiceProvider(services); }
有問題反饋
如果您有任何問題,請提交 Issue 給我們。
AspectCore Project 項目地址: https://github.com/aspectcore
AspectCore Project 文檔地址: https://docs.aspectcore.org(文檔在持續更新中..)