异常描述: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注册服务异常的更多相关文章

  1. 【Java必修课】通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  2. 通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  3. 对象属性键值[key]属性问题

    1,obj[key]此时key代表是循环中的一个变量. var obj = {key:3,key1:1,key2:2,key3:3,toSting:4}; for (key in obj) { con ...

  4. Java中Map根据键值(key)或者值(value)进行排序实现

    我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...

  5. springcloud 向Eureka中注册服务异常java.net.ConnectException: Connection refused: connect

    异常如下: 通过debug发现,服务端的url地址仍然是默认的http://localhost:8761/eureka/apps/,也就是说yml文件中配置没有生效,检查后发现yml中相关配置多写了一 ...

  6. v-for设置键值 key

    总是用 key 配合 v-for.在组件上_总是_必须用 key 配合 v-for,以便维护内部组件及其子树的状态. <ul> <li v-for="todo in tod ...

  7. Java用Gson按照键值key排序json所有节点

    <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifa ...

  8. docker——Etcd高可用键值对数据库

    一.简介 Etcd按照官方介绍: Etcd is a distributed, consistent key-value store for shared configuration and serv ...

  9. php数组array,知道键名如何提取键值

    如果是知道键值,需要查找键名,直接使用array_search()即可.现在反过来,如何操作?   (1)array_walk_recursive()加自定义函数查找   $arr=array( 'n ...

  10. PHP 二维数组去重(保留各个键值的同时去除重复的项)

    对于如下二维数组,要求对其进行去重: $arr = array( '=>array( 'name'=>'james', , ), '=>array( 'name'=>'susu ...

随机推荐

  1. redis系列02---缓存过期、穿透、击穿、雪崩

    一.缓存过期 问题产生的原由: 内存空间有限,给缓存设置过期时间,但有些键值运气比较好,每次都没有被我的随机算法选中,每次都能幸免于难,这可不行,这些长时间过期的数据一直霸占着不少的内存空间! 解决方 ...

  2. Linux 备忘

    ls 通配符 匹配 ? 一个字符 * >=0个任意字符 [ai] a 或者 i [a-i] a/b/c/d...i [!a] 除了a cat cat -n test #加上行号 cat -b t ...

  3. docker / compose 的安装 和 体验

    文档 官网文档 视频 视频 简介 课程内容 1.Docker Compose 容器编排 2.Docker Swarm #集群 热扩容 需要在阿里上买服务器,至少冲100+以上的人民币 文档: 集群方式 ...

  4. 案例-java贪吃蛇(附源码)

    创建屏幕 开始游戏的窗口,首先引入窗口,然后在窗口画布上进行添加各类动画. JFrame frame=new JFrame("My SnakeGame"); Jframe 是个类, ...

  5. SQL Server实战六:T-SQL、游标、存储过程的操作

      本文介绍基于Microsoft SQL Server软件,实现数据库T-SQL语言程序设计,以及游标的定义.使用与存储过程的创建.信息查找的方法. 目录 1 计算1-100间所有可被3整除的数的个 ...

  6. Java简单实现MQ架构和思路02

    Java MQ的100个功能清单 有重复的 一个消息队列(MQ)可以有以下功能: 批量发送消息:允许将多个消息打包成一个批次发送,可以减少网络传输开销和提高系统吞吐量. 消息过期时间:消息可以设置一个 ...

  7. 用 C 语言开发一门编程语言 — Q-表达式

    目录 文章目录 目录 前文列表 Q-表达式 读取并存储输入 实现 Q-Expression 语法解析器 读取 Q-Expression 实现 Q-Expression 的函数 Head & T ...

  8. PageOffice调用本地office实现多人在线同时编辑Word文档

    说明:多人同时在线编辑文件大多数会出现文档相互覆盖的问题,后保存的文档会覆盖先保存的文档.pageoffice的这个功能可以用程序控制不同用户打开文件后,编辑Word文档中属于自己的区域,并且不会互相 ...

  9. sass语法嵌套规则与注释讲解

    语法嵌套规则 选择器嵌套 例如有这么一段css,正常CSS的写法 .container{width:1200px; margin: 0 auto;} .container .header{height ...

  10. PyQGIS二次开发指南

    当你的数据处理使用的是Python语言,而你的导师又让你开发界面,那么PyQGIS二次开发指南是你必读的圣经.QGIS支持Python语言进行二次开发,你将学会如何使用Qt Designer进行界面设 ...