簡單探讨一下.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
是可選的。

如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的【推薦】按鈕,因為你的支援是我繼續寫作,分享的最大動力!
作者:Catcher Wong ( 黃文清 )
來源:http://catcher1994.cnblogs.com/
聲明:
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果您發現部落格中出現了錯誤,或者有更好的建議、想法,請及時與我聯系!!如果想找我私下交流,可以私信或者加我微信。