简单探讨一下.NET Core 3.0使用AspectCore的新姿势

Posted catcher1994

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单探讨一下.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

我们可以通过IHostBuilderUseServiceProviderFactory方法来覆盖默认的工厂实现。

具体使用如下:

// 要引入这个命名空间
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的新姿势的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器

NET Core 3.0中的WPF

.Net Core 3.0原生Json解析器

.NET Core 3.0 可卸载程序集原理简析

在.NET Core 3.0中的WPF中使用IOC图文教程

。NET Core 3.0 StringEnumConverter不作为字符串序列化