天天看点

简单探讨一下.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/

声明:

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果您发现博客中出现了错误,或者有更好的建议、想法,请及时与我联系!!如果想找我私下交流,可以私信或者加我微信。