日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AOP in dotnet :AspectCore的参数拦截支持

發布時間:2023/12/4 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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{ ?
  • ? ??public static void Main(string[] args) ? ?{IServiceCollection services = new ServiceCollection();services.AddAspectCore(options =>{options.AddMethodInject();options.AddParameterIntercept();});services.AddTransient<IAppService, AppService>();services.AddTransient<IAppLifetime, AppLifetime>();IServiceProvider aspectCoreServiceProvider = services.BuildAspectCoreServiceProvider();Console.ReadKey();} }
  • 參數攔截器定義在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完成類似的功能。
    定義如下方法:

    ? ?public interface IAppService{ ? ? ?
    ? ? ?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的参数拦截支持的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。