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

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

概述前言 这几天在对EasyCaching做支持.net core 3.0的调整。期间遇到下面这个错误。 System.NotSupportedException:“ConfigureServices returning an System.IServiceProvider isn‘t supported 针对这个问题,网上能找到比较多的资料是关于Autofac的,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使用AspectCore的新姿势所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1223321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存