.Net8 AddKeyedScoped键值key注册服务异常
异常描述:This service descriptor is keyed. Your service provider may not support keyed services.
场景:.Net8 WebAPI应用程序中使用AutoFac替代了默认的DI容器
当使用键值注册服务后:
builder.Services.AddKeyedSingleton<ICache, BigCache>("big");
builder.Services.AddKeyedSingleton<ICache, SmallCache>("small");
程序启动运行到:
var app = builder.Build(); 出现上述异常。
异常排查过程:
1.根据提示,由于键值服务注册前,使用了Autofac的程序集注册方式RegisterAssemblyTypes,一开始以为是服务已被注册导致的。在程序集外部重写了样例服务,添加注册后问题重现。
2.进一步怀疑是默认的容器键值注册方式版本问题,于是切换使用了AutoFac容器的键值注册方式:
ContainerBuilder.RegisterType<TImplements>().Keyed<TInterface>(key);
程序启动后,不报错了。以为问题解决了,结果在使用key获取服务时IServiceProvider.GetKeyedService<T>(key),获取不到。感觉应该还是没有注册成功。
3.上面已经开始怀疑DI容器版本问题,于是进一步排查。看了下默认容器DI版本Microsoft.Extensions.DependencyInjection是8.0没啥问题。然后看了下Autofac-DI版本是8.0并且依赖的默认DI也是8.0。
也没看出啥问题,但是nuget包管理器中Autofac-DI已经支持9.0,侥幸心理升级了一下。重新启动程序,重试一下竟然可以了。。。
回过头来想了一下,其实在第二步中使用Autofac键值注册时,未出现异常,只是未注册成功,这里应该就说明Autofac-DI有问题了。
这里也给了自己一个警醒,由于项目中引用的很多第三方组件,出现问题时往往对组件内部不太熟悉,无从下手解决,这个时候不妨先看下引用版本,有可能出现的问题已经被打补丁解决了,这样至少可以少走很多弯路。
.Net8 AddKeyedScoped键值key注册服务异常的更多相关文章
- 【Java必修课】通过Value获取Map中的键值Key的四种方法
1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...
- 通过Value获取Map中的键值Key的四种方法
1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...
- 对象属性键值[key]属性问题
1,obj[key]此时key代表是循环中的一个变量. var obj = {key:3,key1:1,key2:2,key3:3,toSting:4}; for (key in obj) { con ...
- Java中Map根据键值(key)或者值(value)进行排序实现
我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...
- springcloud 向Eureka中注册服务异常java.net.ConnectException: Connection refused: connect
异常如下: 通过debug发现,服务端的url地址仍然是默认的http://localhost:8761/eureka/apps/,也就是说yml文件中配置没有生效,检查后发现yml中相关配置多写了一 ...
- v-for设置键值 key
总是用 key 配合 v-for.在组件上_总是_必须用 key 配合 v-for,以便维护内部组件及其子树的状态. <ul> <li v-for="todo in tod ...
- Java用Gson按照键值key排序json所有节点
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifa ...
- docker——Etcd高可用键值对数据库
一.简介 Etcd按照官方介绍: Etcd is a distributed, consistent key-value store for shared configuration and serv ...
- php数组array,知道键名如何提取键值
如果是知道键值,需要查找键名,直接使用array_search()即可.现在反过来,如何操作? (1)array_walk_recursive()加自定义函数查找 $arr=array( 'n ...
- PHP 二维数组去重(保留各个键值的同时去除重复的项)
对于如下二维数组,要求对其进行去重: $arr = array( '=>array( 'name'=>'james', , ), '=>array( 'name'=>'susu ...
随机推荐
- redis系列02---缓存过期、穿透、击穿、雪崩
一.缓存过期 问题产生的原由: 内存空间有限,给缓存设置过期时间,但有些键值运气比较好,每次都没有被我的随机算法选中,每次都能幸免于难,这可不行,这些长时间过期的数据一直霸占着不少的内存空间! 解决方 ...
- Linux 备忘
ls 通配符 匹配 ? 一个字符 * >=0个任意字符 [ai] a 或者 i [a-i] a/b/c/d...i [!a] 除了a cat cat -n test #加上行号 cat -b t ...
- docker / compose 的安装 和 体验
文档 官网文档 视频 视频 简介 课程内容 1.Docker Compose 容器编排 2.Docker Swarm #集群 热扩容 需要在阿里上买服务器,至少冲100+以上的人民币 文档: 集群方式 ...
- 案例-java贪吃蛇(附源码)
创建屏幕 开始游戏的窗口,首先引入窗口,然后在窗口画布上进行添加各类动画. JFrame frame=new JFrame("My SnakeGame"); Jframe 是个类, ...
- SQL Server实战六:T-SQL、游标、存储过程的操作
本文介绍基于Microsoft SQL Server软件,实现数据库T-SQL语言程序设计,以及游标的定义.使用与存储过程的创建.信息查找的方法. 目录 1 计算1-100间所有可被3整除的数的个 ...
- Java简单实现MQ架构和思路02
Java MQ的100个功能清单 有重复的 一个消息队列(MQ)可以有以下功能: 批量发送消息:允许将多个消息打包成一个批次发送,可以减少网络传输开销和提高系统吞吐量. 消息过期时间:消息可以设置一个 ...
- 用 C 语言开发一门编程语言 — Q-表达式
目录 文章目录 目录 前文列表 Q-表达式 读取并存储输入 实现 Q-Expression 语法解析器 读取 Q-Expression 实现 Q-Expression 的函数 Head & T ...
- PageOffice调用本地office实现多人在线同时编辑Word文档
说明:多人同时在线编辑文件大多数会出现文档相互覆盖的问题,后保存的文档会覆盖先保存的文档.pageoffice的这个功能可以用程序控制不同用户打开文件后,编辑Word文档中属于自己的区域,并且不会互相 ...
- sass语法嵌套规则与注释讲解
语法嵌套规则 选择器嵌套 例如有这么一段css,正常CSS的写法 .container{width:1200px; margin: 0 auto;} .container .header{height ...
- PyQGIS二次开发指南
当你的数据处理使用的是Python语言,而你的导师又让你开发界面,那么PyQGIS二次开发指南是你必读的圣经.QGIS支持Python语言进行二次开发,你将学会如何使用Qt Designer进行界面设 ...