AOP in dotnet :AspectCore的参数拦截支持
距離上一篇AspectCore的介紹發布已經很長一段時間了,這篇文章也早該和大家見面,最近一直忙于適應新工作,并在業余時間有幸向何鎮汐,Savorboard,農夫,AlexLEWIS等幾位大牛請教學習,收獲頗多。另一方面,一直在對AspectCore進行重構,并把AspectCore從AspectCore Project遷移到.NET China Foundation(前身為AspNetCore文檔翻譯小組),由我和 DotNetCore 項目組共同維護。下面言歸正傳,一起來看一下AspectCore給大家帶來的新特性。
AspectCore 0.1.2-release
AspectCore v0.1.2已經正式發布,相對于前一個版本,V0.1.2中除了修復若干bug外,最重要的特性就是帶來了方法參數攔截器和方法參數注入的支持。
參數攔截器
我們先來看下面的方法:
public class AppService : IAppService{ ? ??public void Run(string[] args) ? ?{ ? ?
? ?if (args == null){ ? ? ? ? ? ?throw new ArgumentNullException(nameof(args));} ? ? ? ?// todo..} }
在開發中,對方法的輸入參數進行非空校驗是一個不錯的編程習慣,可以避免意外的拋出NullReferenceException,但對于所有方法的參數都進行如上的手動驗證的話,又是一個很耗費人力的事情。那么能不能只在參數上標記自定義的特性,讓框架來幫助我們進行自動的參數驗證呢?比如下面的代碼:
public void Run([NotNull]string[] args){ ? ?//todo..}接下來,讓我們來看看AspectCore是怎么做的吧。
新建.net core的ConsoleApp項目,添加AspectCore的nuget packages:
PM> Install-Package AspectCore.Extensions.DependencyInjectionPM> Install-Package AspectCore.Extensions.CrossParameters在Main方法中添加:
public class Program{ ?參數攔截器定義在AspectCore.Extensions.CrossParameters命名空間下,并已經內置NotNullAttribute進行非空驗證,我們來通過繼承ParameterInterceptorAttribute來自定義另一個參數攔截器NotNullOrEmptyAttribute:
public class NotNullOrEmptyAttribute : ParameterInterceptorAttribute{ ? ?public override Task Invoke(IParameterDescriptor parameter, ParameterAspectContext context, ParameterAspectDelegate next) ? ?{ ? ? ? ?if (parameter.ParameterType == typeof(string)){ ? ? ? ? ? ?if (string.IsNullOrEmpty(parameter.Value?.ToString())){ ? ? ? ? ? ? ? ?throw new ArgumentException($"Invalid parameter. {parameter.Name} cannot be null or empty");}} ? ? ? ?return next(parameter, context);} }定義需要進行參數攔截的方法:
public interface IAppService{ ? ?void Run([NotNull]string[] args); ? ?void Stop([NotNullOrEmpty]string message); ? ?//..}通過AspectCore創建的類型實例便能在運行時對標記了特性的方法參數進行攔截驗證。
方法參數注入
在Asp.Net Core MVC中我們通過在Action的參數上標記[FromServices]來進行參數注入。那么在非Controller類和非Action方法中,我們同樣可以通過AspectCore完成類似的功能。
定義如下方法:
? ? ?Lifetime GetLifetime([Inject]IAppLifetime lifetime = null);}
那么我們可以在調用時:
var appService = aspectCoreServiceProvider.GetService<IAppService>(); appService.GetLifetime();參數IAppLifetime lifetime便會自動在運行時注入到方法中。
本文的示例代碼在AspectCore/Sample。
AspectCore的后續計劃
AspectCore 正式更名為?AspectCore Framework,旨在提供以AOP為核心的跨平臺開發框架,正在開發的版本定義為v0.2-preview1,在這個版本中,我們會添加如下基礎組件:
AspectCore.Extensions.Reflection : 高性能的反射擴展
AspectCore.Extensions.Expression : 表達式樹和Emit擴展
AspectCore.Extensions.Mapper : 輕量級對象映射庫
AspectCore.Extensions.DataValidations : 服務層方法的數據驗證組件
AspectCore.Extensions.CrossProperties : 屬性攔截器
有問題反饋
如果您有任何想法或建議,歡迎提交Issues給我們。
QQ群 dotNET Core Studying Group : 436035237
歡迎加入
如果您對AspectCore Framework感興趣或者想對.net core做出貢獻,都歡迎您加入?AspectCore Framework?或?.NET China Foundation下的任何其他項目。
如果您有優秀的.net core開源項目,也歡迎項目加入?.NET China Foundation。
現在是.net core開源最好的時代,讓我們一起為.net core貢獻自己的一份力量吧!
相關文章:?
?[Asp.Net Core輕量級Aop解決方案]AspectCore Project 介紹
Asp.Net Core輕量級Aop解決方案:AspectCore
原文地址:http://www.cnblogs.com/liuhaoyang/p/aspectcore-crossparameters.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的AOP in dotnet :AspectCore的参数拦截支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core快速入门教程 4、使用
- 下一篇: .NET Core 事件总线,分布式事务