前言

这几天在对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的新姿势的更多相关文章

  1. Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page

    Razor Page介绍 前言 上周期待已久的Asp.Net Core 2.0提前发布了,一下子Net圈热闹了起来,2.0带来了很多新的特性和新的功能,其中Razor Page引起我的关注,作为web ...

  2. 探索ASP.NET Core 3.0系列一:新的项目文件、Program.cs和generic host

    前言:在这篇文章中我们来看看ASP.Net Core 3.0应用程序中一些基本的部分—— .csproj项目文件和Program.cs文件.我将会介绍它们从 ASP.NET Core 2.x 中的默认 ...

  3. 打造静态分析器(二)基于Asp.Net Core 3.0的AspectCore组件检测

    上一篇,我们打造了一个简单的分析器,但是我们实际使用分析器就是为了对项目做分析检测,增加一些非语法的自检的 比如Asp.Net Core 3.0的替换依赖注入检测 设计分析 我们创建一个默认的Asp. ...

  4. 初识ASP.NET Core 1.0

    本文将对微软下一代ASP.NET框架做个概括性介绍,方便大家进一步熟悉该框架. 在介绍ASP.NET Core 1.0之前有必要澄清一些产品名称及版本号.ASP.NET Core1.0是微软下一代AS ...

  5. 在 Mac OS 上创建并运行 ASP.NET Core 1.0 网站

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  6. .Net Core 2.0生态(3):ASP.NET Core 2.0 特性介绍和使用指南

    ASP.NET Core 2.0 发布日期:2017年8月14日 ASP.NET团队宣布ASP.NET Core 2.0正式发布,发布Visual Studio 2017 15.3支持ASP.NET ...

  7. asp.net core 1.0初识

    本文将对微软下一代ASP.NET框架做个概括性介绍,方便大家进一步熟悉该框架. 在介绍ASP.NET Core 1.0之前有必要澄清一些产品名称及版本号.ASP.NET Core1.0是微软下一代AS ...

  8. ASP.NET Core 1.0基础之诊断

    来源https://docs.asp.net/en/latest/fundamentals/diagnostics.html ASP.NET Core 1.0包含了一些新的特性来辅助诊断问题.可以在S ...

  9. Net Core 2.0生态1

    Net Core 2.0生态 阅读目录 前言:答读者问(time by:2017.8.19) 项目升级到ASP.NET Core 2.0 新增功能:Razor Pages介绍 模板更新 Entity ...

随机推荐

  1. 21.决策树(ID3/C4.5/CART)

    总览 算法   功能  树结构  特征选择  连续值处理 缺失值处理  剪枝  ID3  分类  多叉树  信息增益   不支持 不支持  不支持 C4.5  分类  多叉树  信息增益比   支持 ...

  2. 网页前端之JavaScript学习记录总结篇

    咔咔咔咔咔咔扩扩扩扩扩扩扩扩扩扩

  3. 汇编子程序模块化(near&far)

    1: Near 近端使用  C语言实现:  #include <stdio.h>#include <stdlib.h> void print(){ printf("p ...

  4. [Spring cloud 一步步实现广告系统] 9. 主类和配置文件

    搜索系统启动主类 /** * AdSearchApplication for 广告搜索服务启动类 * * @author <a href="mailto:magicianisaac@g ...

  5. Web前端基础(19):jQuery基础(六)

    1. ajax 1.1 什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJAX通 ...

  6. linu运行级别

    一.介绍 0:关机 1:单用户[找回丢失密码] 2:多用户状态[无网络服务] 3:多用户状态[有网络服务] 4:保留级别 5:图形界面 6:系统重启 二.命令行运行级别 比如说关机 init 0 三. ...

  7. Python语法易错点

    列表.数组赋值 a = [1,6] b = a * 2 b[0] = -9999 print(a) print(b) [1, 6] [-9999, 6, 1, 6] a = [1,6] b = a b ...

  8. C# 利用itextsharp、Spire配合使用为pdf文档每页添加水印

    下载类库: 直接下载 引入类库 功能实现 using iTextSharp.text.pdf; using Spire.Pdf; using Spire.Pdf.Graphics; using Sys ...

  9. jquery实现get的异步请求

    <%@ page contentType="text/html;charset=UTF-8" language="java" %><html& ...

  10. UI视图控件、视图嵌套、SubView、Tag 的使用

    - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchO ...