首页 > 其他分享 >.Net8 AddKeyedScoped键值key注册服务异常

.Net8 AddKeyedScoped键值key注册服务异常

时间:2024-06-20 13:32:40浏览次数:26  
标签:容器 Autofac key DI AddKeyedScoped 键值 注册

异常描述: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有问题了。

这里也给了自己一个警醒,由于项目中引用的很多第三方组件,出现问题时往往对组件内部不太熟悉,无从下手解决,这个时候不妨先看下引用版本,有可能出现的问题已经被打补丁解决了,这样至少可以少走很多弯路。

 

标签:容器,Autofac,key,DI,AddKeyedScoped,键值,注册
From: https://www.cnblogs.com/chenxf1117/p/18255775

相关文章

  • Vue 中 v-for 的全方位解读:含案例与 key 属性运用及常用数组方法
    目录v-for介绍v-forkey属性的使用Vue数组方法v-for介绍        v-for能够对数字、数组以及对象进行遍历。值得注意的是,当v-for与v-if一同运用时,v-for的优先级要高于v-if。正因如此,应尽量避免将v-if和v-for共同使用。特别是在嵌套使用的情况下,每一......
  • 开发Prometheus的redis bigkey exporter,完善k8s下redis容器的性能监控
      好久没来博客园写技术总结了,回顾这些年的职业路径,从自动化测试到python后端到golang后端直到现在的devops,确实积累了很多心得,可惜都没时间来写写这些心得(主要是懒)。自从转为devops后确实有比较多的时间了(主要是加班少:)),看来以后还是要多写写技术总结:)。   废话不......
  • [转帖]Redis中删除过期Key的三种策略
    Redis对于过期键有三种清除策略被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动随机淘汰一批已过期的key当前已用内存超过maxmemory限定时,触发主动清理策......
  • Android 配置蓝牙遥控器键值
    文章目录篇头一、规格书二、红外按键配置三、蓝牙按键配置3.1查看设备号3.1.1方式一:dumpsysinput3.1.2方式二:cat/proc/bus/input/devices3.2配置kl文件3.2.1方案商原始配置3.2.2Generic.kl文件3.2.3重映射蓝牙按键3.2.4完成Vendor\_568a\_Product\_9869.kl......
  • 卫士通电科网安安全IpSec网关Ukey开发对接
    官方公开的开发文档,有几个坑,着重说一下踩坑的记录过程。1、通过官方的客户端接口模拟程序获取前端参数:随机数和token2、java程序调用官方sdk,postman请求测试:3、贴出关键的java集成类:importcn.hutool.json.JSONObject;importcn.hutool.json.JSONUtil;importcom.ewa......
  • LeetCode 2268. Minimum Number of Keypresses
    原题链接在这里:https://leetcode.com/problems/minimum-number-of-keypresses/description/题目:Youhaveakeypadwith 9 buttons,numberedfrom 1 to 9,eachmappedtolowercaseEnglishletters.Youcanchoosewhichcharacterseachbuttonismatchedtoaslong......
  • ssh-key-deploy:一个在Windows上创建ssh密钥并且自动部署到Linux服务器上的小工具
    ssh-key-deploy简介使用Python编写的一个在Windows上创建ssh密钥并且自动部署到Linux服务器上的小工具。功能特点创建具有自定义名称和可选密码的SSH密钥。列出本地存储的所有SSH密钥。将SSH密钥安全地上传到远程服务器。使用直观的命令行界面进行操作,支持菜单导航。友好......
  • [Tkey] A decorative fence
    还是看看简单而富有美感的爆搜吧#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definetestsintcases;cin>>cases;while(cases--)intn,l;vector<int>e;boolvis[21];intcnt=0;voiddfs(intp){ if(cnt==l)return; if(p>n){ cnt++......
  • WPF window keydown
    <Windowx:Class="WpfApp175.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合
    Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合和哈希表。以下是一些Redis命令的实践示例,帮助你了解如何使用Redis。连接Redis服务器首先,使用redis-cli命令连接到Redis服务器:redis-cli-h<hostname>-p<port>基本命令PING:检查Redis......