简单探讨一下.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的新姿势的更多相关文章
- 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 ...
- 探索ASP.NET Core 3.0系列一:新的项目文件、Program.cs和generic host
前言:在这篇文章中我们来看看ASP.Net Core 3.0应用程序中一些基本的部分—— .csproj项目文件和Program.cs文件.我将会介绍它们从 ASP.NET Core 2.x 中的默认 ...
- 打造静态分析器(二)基于Asp.Net Core 3.0的AspectCore组件检测
上一篇,我们打造了一个简单的分析器,但是我们实际使用分析器就是为了对项目做分析检测,增加一些非语法的自检的 比如Asp.Net Core 3.0的替换依赖注入检测 设计分析 我们创建一个默认的Asp. ...
- 初识ASP.NET Core 1.0
本文将对微软下一代ASP.NET框架做个概括性介绍,方便大家进一步熟悉该框架. 在介绍ASP.NET Core 1.0之前有必要澄清一些产品名称及版本号.ASP.NET Core1.0是微软下一代AS ...
- 在 Mac OS 上创建并运行 ASP.NET Core 1.0 网站
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- .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 ...
- asp.net core 1.0初识
本文将对微软下一代ASP.NET框架做个概括性介绍,方便大家进一步熟悉该框架. 在介绍ASP.NET Core 1.0之前有必要澄清一些产品名称及版本号.ASP.NET Core1.0是微软下一代AS ...
- ASP.NET Core 1.0基础之诊断
来源https://docs.asp.net/en/latest/fundamentals/diagnostics.html ASP.NET Core 1.0包含了一些新的特性来辅助诊断问题.可以在S ...
- Net Core 2.0生态1
Net Core 2.0生态 阅读目录 前言:答读者问(time by:2017.8.19) 项目升级到ASP.NET Core 2.0 新增功能:Razor Pages介绍 模板更新 Entity ...
随机推荐
- 关于String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
关于 String path = request.getContextPath(); String basePath = request.getScheme()+"://"+req ...
- 你真的会用搜索吗?—— google 搜索技巧
鄙人用了那么多年 google ,却只会简单的空格. 虽然空格已经很强大了.google 对此做了非常多的优化,原则是让你只用最基础的输入搭配空格就能达到跟下面介绍的方法几乎一样的效果,但是还有知道一 ...
- JS如何判断鼠标滚轮向上还是向下滚动
前几天偶然看到某前端群有人在问:JS如何判断鼠标滚轮向上还是向下滚动? 我想了想,有点蒙蔽,心想难道不是用scrollTop来判断吗? 但我不确定,也出于好奇心,于是开始了一番探索 思路:通过even ...
- java spring是元编程框架---使用的机制是注解+配置
java spring是元编程框架---使用的机制是注解+配置
- 文件批量生成IO流读写
/// <summary> /// 生成文件的 /// </summary> /// <param name="calssName"></ ...
- 关于kubernetes我们还有什么可做的?
kubernetes在容器编排大战中由于应用的可移植性以及支持混合云/多云部署方式上的灵活性.加上开放可扩展的理念,使得周边社区非常活跃.从既有调研结果看,kubernetes已成为容器编排领域的标准 ...
- docker安装mysql、es、jenkins等一些步骤以及如何设置docker国内镜像
CentOS7安装Docker步骤: (0)删除旧的可能安装过的包 yum remove docker \ docker-client \ ...
- javascript模块化开发(二)
模块化开发(一) ES6模块化 详解 ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict". 顶层的this指向undefined,即不应该在顶层代码 ...
- angluarjs实现过滤并替换关键字
html样式 <body ng-app="myapp" ng-controller="myCtrl"> <input type="t ...
- 42-volume 生命周期管理
Data Volume 中存放的是重要的应用数据,如何管理 volume 对应用至关重要.前面我们主要关注的是 volume 的创建.共享和使用,本节将讨论如何备份.恢复.迁移和销毁 volume. ...