什么是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<ICustomService, CustomService>(); services.AddMvc(); services.AddAspectCore(); return services.BuildAspectCoreServiceProvider();}攔截器配置。首先安裝AspectCore.Extensions.Configuration package:
PM> Install-Package AspectCore.Extensions.Configuration
全局攔截器。使用AddAspectCore(Action<AspectCoreOptions>)的重載方法,其中AspectCoreOptions提供InterceptorFactories注冊全局攔截器:
services.AddAspectCore(config => { config.InterceptorFactories.AddTyped<CustomInterceptorAttribute>(); });帶構造器參數的全局攔截器,在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"); } }}
新聞熱點
疑難解答
圖片精選