dotnetcore實現Aop

来源:https://www.cnblogs.com/yyfh/archive/2019/09/10/11496033.html
-Advertisement-
Play Games

Asp.NetCore實現Aop,AspectCore實現Aop ...


dotnetcore實現Aop

   Aop大家都不陌生,然而今天給大家不將講官方的filter,今天給大家分享一個輕量級的Aop解決方案(AspectCore)

什麼是AspectCore

AspectCore是一個面向切麵編程,基於.NetCore和.NetFramwork的擴平臺框架,對方法攔截器、依賴項註入集成、web應用程式、數據驗證等提供核心支持。

AspectCore基本特性

  • 提供抽象的Aop介面,基於該介面可以輕鬆的使用自己的代理類實現替換預設的實現.

  • 框架不包含IoC,也不依賴具體IoC實現,可以使用Asp.Net Core的內置依賴註入或者任何相容Asp.Net Core的第三方Ioc來繼承AspectCore到Asp.NetCore應用中

  • 高性能的非同步攔截系統

  • 靈活的配置系統

  • 基於service的而非基於實現類的切麵構造

  • 支持擴平臺的Asp.Net Core環境

使用AspectCore

從NuGet中安裝AspectCore

AspectCore.Extensions.DependencyInjection

package

PM> Install-package AspectCore.Extensions.DependencyInjection

下麵我創建了一個Api應用程式.

NuGet安裝

AspectCore.Configuration

package

PM> Install-package AspectCore.Configuration

下麵我新建了一個攔截器 CustomInterceptorAttribute,繼承AbstractInterceptorAttribute(一般情況下繼承他即可),他實現IInterceptor介面AspectCore預設實現了基於Attribute的攔截器配置。

/// <summary>
///     自定義攔截器
/// </summary>
public class CustomInterceptorAttribute : AbstractInterceptorAttribute
{
    /// <summary>
    ///     實現抽象方法
    /// </summary>
    /// <param name="context"></param>
    /// <param name="next"></param>
    public override async Task Invoke(AspectContext context, AspectDelegate next)
    {
        try
        {
            Console.WriteLine("執行之前");
            await next(context);//執行被攔截的方法
        }
        catch (Exception)
        {
            Console.WriteLine("被攔截的方法出現異常");
            throw;
        }
        finally
        {
            Console.WriteLine("執行之後");
        }
    }
}

定義ICustomService介面和它的實現類CustomService:

public interface ICustomService
{
    DateTime GetDateTime();
}
public class CustomService : ICustomService
{
    public DateTime GetDateTime()
    {
        return DateTime.Now;

     }
}

在ValuesController註入ICustomService

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private readonly ICustomService _icustomserveice;
    public ValuesController(ICustomService icustomService) {
        this._icustomserveice = icustomService;
    }

    // GET api/values
    [HttpGet]
    public DateTime Get()
    {
        return _icustomserveice.GetDateTime();
    }

}

註冊ICustomService,並創建代理容器

 public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<ICustomService,CustomService>();
            services.AddMvc();
            //全局攔截器。使用AddDynamicProxy(Action<IAspectConfiguration>)的重載方法,其中IAspectConfiguration提供Interceptors註冊全局攔截器:
            services.ConfigureDynamicProxy(config=> {
                config.Interceptors.AddTyped<CustomInterceptorAttribute>();
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            return services.BuildAspectInjectorProvider();
     }

作為服務的全局攔截器。在ConfigureServices中添加:

services.AddTransient<CustomInterceptorAttribute>(provider => new CustomInterceptorAttribute());

作用於特定ServiceMethod的全局攔截器,下麵的代碼演示了作用於帶有Service尾碼的類的全局攔截器:

 services.ConfigureDynamicProxy(config =>
            {
                config.Interceptors.AddTyped<CustomInterceptorAttribute>(method => method.DeclaringType.Name.EndsWith("Service"));
            });

通配符攔截器,匹配尾碼為Service

 services.ConfigureDynamicProxy(config =>
            {
                config.Interceptors.AddTyped<CustomInterceptorAttribute>(Predicates.ForService("*Service"));
            });

在AspectCore中提供NonAspectAttribute來使得ServiceMethod不被代理:

   [NonAspect]
    DateTime GetDate();

全局配置忽略條件

      services.ConfigureDynamicProxy(config =>
        {
            //Namespace命名空間下的Service不會被代理
            config.NonAspectPredicates.AddNamespace("Namespace");
            //最後一級為Namespace的命名空間下的Service不會被代理
            config.NonAspectPredicates.AddNamespace("*.Namespace");
            //ICustomService介面不會被代理
            config.NonAspectPredicates.AddService("ICustomService");
            //尾碼為Service的介面和類不會被代理
            config.NonAspectPredicates.AddService("*Service");
            //命名為Method的方法不會被代理
            config.NonAspectPredicates.AddMethod("Method");
            //尾碼為Method的方法不會被代理
            config.NonAspectPredicates.AddMethod("*Method");
        });

AspectCore: [https://github.com/dotnetcore/AspectCore-Framework]
測試項目地址: [https://github.com/fhcodegit/DotNetAspectCore/tree/master]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...
  • 背景:臨時提供一個簡單的網頁,供其他人瀏覽資料庫(Oracel、MSSQL)的某些數據,並導出Excel。 ...
  • 依賴註入主要是一種結構性的模式,註重的是類與類之間的結構,它要達到的目的就是設計原則中最少知道和合成復用的原則,減少內部依賴,履行單一職責,最終就是強解耦。依賴註入目前最好的實現就是依賴註入容器。 Unity是微軟Patterns & Practices團隊所開發的一個輕量級的,並且可擴展的依賴註入 ...
  • 場景 DevExpress的PanelControl常用進行窗體頁面的佈局。 一般是拖拽一個PannelControl,然後是再拖拽其他控制項。 如果是由代碼生成控制項並控制佈局的話,怎樣實現。 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 比如說要在PanelContrl中 ...
  • 通過 abp(net core)+easyui+efcore實現倉儲管理系統——菜單-上 (十六)這篇文章,我們已經瞭解了ABP中的菜單相關的類及類的屬性與方法,接下我們通過實例來實現一個動態載入菜單的功能。動態菜單是我們在abp(net core)+easyui+efcore實現倉儲管理系統——領... ...
  • 場景 使用DevExpress的EditText控制項時,需要限制其輸入類型為數字。 正常來說是窗體上拖拽一個TextEdit,然後在設計視窗點擊小三角,選擇Change Mask 但是如果說TextEdit控制項不是拖拽上去而是由代碼生成的,那麼在代碼中怎樣設置只能輸入數字。 關註公眾號 霸道的程式猿 ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...
  • Win10 IIS預設是.net 4.0,安裝VS2015後,IIS沒有.net 4.5,解決方法,直接在CMD命令行下執行下麵語句 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...