天天看點

簡單探讨一下.NET Core 3.0使用AspectCore的新姿勢

簡單探讨一下.NET Core 3.0使用AspectCore的新姿勢

前言

這幾天在對EasyCaching做支援.net core 3.0的調整。期間遇到下面這個錯誤。

System.NotSupportedException:“ConfigureServices returning an System.IServiceProvider isn't supported

針對這個問題,網上能找到比較多的資料是關于Autofac的,AspectCore的好像比較少。

下面就直接看看簡單的處理方法,也在AspectCore上面的Issue回複了。

ServiceProviderFactory的使用

在preview3之後,

ConfigureServices

方法就不支援直接傳回

System.IServiceProvider

我們可以通過

IHostBuilder

UseServiceProviderFactory

方法來覆寫預設的工廠實作。

具體使用如下:

// 要引入這個命名空間     using AspectCore.Extensions.DependencyInjection;     using Microsoft.AspNetCore.Hosting;     using Microsoft.Extensions.Hosting;     public class Program     {         public static void Main(string[] args)         {             CreateHostBuilder(args).Build().Run();         }         public static IHostBuilder CreateHostBuilder(string[] args) =>             Host.CreateDefaultBuilder(args)                 .ConfigureWebHostDefaults(webBuilder =>                 {                     webBuilder.UseStartup<Startup>();                 })                 // for aspcectcore                 .UseServiceProviderFactory(new AspectCoreServiceProviderFactory())             ;     }           

到這裡,我們“系統”級别的配置已經OK。也可以看看

AspectCoreServiceProviderFactory

的實作

[NonAspect]     public class AspectCoreServiceProviderFactory : IServiceProviderFactory<IServiceContainer>     {         public IServiceContainer CreateBuilder(IServiceCollection services)         {             return services.ToServiceContainer();         }         public IServiceProvider CreateServiceProvider(IServiceContainer containerBuilder)         {             return containerBuilder.Build();         }     }           

就實作了

IServiceProviderFactory<T>

兩個方法,十分的簡單。

如果有特殊的AspectCore要求,好比實作一個簡單的AOP,我們要把代碼寫那裡呢?

下面還有另外一個主角

ConfigureContainer

ConfigureContainer的使用

我們隻需要在

Startup

裡面加一個ConfigureContainer方法就可以實作相應的擴充。

public class Startup     {         public void ConfigureServices(IServiceCollection services)         {              // ...         }         public void ConfigureContainer(IServiceContainer builder)         {             // 這裡就是熟悉的味道了。。。             builder.Configure(config =>             {                             config.Interceptors.AddTyped<xxx>();             });         }         public void Configure(IApplicationBuilder app)         {             // ...         }     }           

可以看到

ConfigureContainer

的參數是和

AspectCoreServiceProviderFactory

裡面的類型T是一緻的!

這裡要注意一點,ConfigureContainer會在ConfigureServices之後執行,不小心會出現覆寫的情況,是以一定要特别注意,不要在這些地方進行Build操作!!并且Startup中隻能有一個ConfigureContainer方法,ConfigureContainer方法隻能有一個參數。

總結

知道這兩個地方,加上AspectCore的基本用法,應該就可以在3.0中正常的使用AspectCore了。

其中

UseServiceProviderFactory

是必須的,

ConfigureContainer

是可選的。

簡單探讨一下.NET Core 3.0使用AspectCore的新姿勢

如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的【推薦】按鈕,因為你的支援是我繼續寫作,分享的最大動力!

作者:Catcher Wong ( 黃文清 )

來源:http://catcher1994.cnblogs.com/

聲明:

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果您發現部落格中出現了錯誤,或者有更好的建議、想法,請及時與我聯系!!如果想找我私下交流,可以私信或者加我微信。

繼續閱讀