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

net8,addkeyedscoped,key · 浏览次数 : 0

小编点评

异常描述:This service descriptor is keyed. Your service provider may not support keyed services. 场景:.Net 8 WebAPI应用程序中使用AutoFac替代了默认的DI容器当使用键值注册服务后: ``` builder.Services.AddKeyedSingleton("big"); builder.Services.AddKeyedSingleton("small"); ``` 程序启动运行到: ``` var app = builder.Build(); ``` 出现上述异常。 异常排查过程: 1. 根据提示,由于键值服务注册前,使用了Autofac的程序集注册方式`RegisterAssemblyTypes`,一开始以为是服务已被注册导致的。在程序集外部重写了样例服务,添加注册后问题重现。 2. 进一步怀疑是默认的容器键值注册方式版本问题,于是切换使用了AutoFac容器的键值注册方式: ``` ContainerBuilder.RegisterType().Keyed(key); ``` 程序启动后,不报错了。以为问题解决了,结果在使用`IServiceProvider.GetKeyedService(key)`,获取不到。 感觉应该还是没有注册成功。 3. 上面已经开始怀疑DI容器版本问题,于是进一步排查。看了下默认容器DI版本`Microsoft.Extensions.DependencyInjection`是8.0没啥问题。然后看了下Autofac-DI版本是8.0并且依赖的默认DI也是8.0。也没看出啥问题,但是`nuget`包管理器中`Autofac-DI`已经支持9.0,侥幸心理升级了一下。 重新启动程序,重试一下竟然可以了。 回过头来想了一下,其实在第二步中使用Autofac键值注册时,未出现异常,只是未注册成功,这里应该就说明`Autofac-DI`有问题了。这里也给了自己一个警醒,由于项目中引用的很多第三方组件,出现问题时往往对组件内部不太熟悉,无从下手解决,这个时候不妨先看下引用版本,有可能出现的问题已经被打补丁解决了,这样至少可以少走很多弯路。 归纳总结以上内容,生成内容时需要带简单的排版 总结:在.Net 8 WebAPI应用程序中,使用AutoFac作为DI容器时,遇到了由于服务提供者不支持keyed services而导致的异常。通过排查,发现问题的根源在于Autofac-DI版本与项目默认的DI版本不一致。最终,在升级到支持9.0版本的`Autofac-DI`后,问题得到解决。在此过程中,学会了在遇到问题时如何进行有效的排查和解决,以及如何关注第三方组件的版本问题。

正文

异常描述: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注册服务异常相似的内容:

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

异常描述:This service descriptor is keyed. Your service provider may not support keyed services. 场景:.Net8 WebAPI应用程序中使用AutoFac替代了默认的DI容器 当使用键值注册服务后: build

NET8中增加的简单适用的DI扩展库Microsoft.Extensions.DependencyInjection.AutoActivation

这个库提供了在启动期间实例化已注册的单例,而不是在首次使用它时实例化。 单例通常在首次使用时创建,这可能会导致响应传入请求的延迟高于平时。在注册时创建实例有助于防止第一次Request请求的SLA 以往我们要在注册的时候启动单例可能会这样写: //注册: services.AddSingleton<

.NET8 Identity Register

分享给需要帮助的人:记一次 IdentityAPI 中注册的源码解读:设置用户账户为未验证状态,以及除此之外更安全的做法: 延迟用户创建。包含了对优缺点的说明,以及适用场景。 在ASP.NET 8 Identity 中注册API的源码如下: routeGroup.MapPost("/register

.NET8中的Microsoft.Extensions.Http.Resilience库

接上一篇,https://www.cnblogs.com/vipwan/p/18129361 借助Aspire中新增的Microsoft.Extensions.ServiceDiscovery库,我们可以很容易的做到服务发现,那么服务节点的熔断限流以及重试等弹性机制.NET是怎么处理的呢? 比如下图

【.NET8】访问私有成员新姿势UnsafeAccessor(上)

前言 前几天在.NET性能优化群里面,有群友聊到了.NET8新增的一个特性,这个类叫UnsafeAccessor,有很多群友都不知道这个特性是干嘛的,所以我就想写一篇文章来带大家了解一下这个特性。 其实在很早之前我就有关注到这个特殊的特性,但是当时.NET8还没有正式发布,所以我也没有写文章,现在.

【.NET8】访问私有成员新姿势UnsafeAccessor(下)

前言 书接上回,我们讨论了在.NET8中新增的UnsafeAccessor,并且通过UnsafeAccessor访问了私有成员,这极大的方便了我们代码的编写,当然也聊到了它当前存在的一些局限性,那么它的性能到底如何?我们今天就来实际测试一下。 测试代码 话不多说,直接上代码,本次测试代码如下: us

【c#版本Openfeign】Net8 自带OpenFeign实现远程接口调用

引言 相信巨硬,我们便一直硬。Net版本到现在已经出了7了,8也已经在预览版了,相信在一个半月就会正式发布,其中也有很多拭目以待的新功能了,不仅仅有Apm和Tap的结合,TaskToAscynResult,以及UnsafeAccessor用来获取私有变量,性能比反射,EMIT更高,还有针对Async

【.NET 8】ASP.NET Core计划 - 支持更完善的AOT发布

.NET7.0刚发布不久,.NET社区开始了.NET8.0的开发,重心重新回到了新功能的迭代。 我们知道在.NET7.0中一个令人激动的特新就是支持了NativeAOT,我们可以通过NativeAOT生成本机程序,由于无需JIT编译,所以无需安装.NET Runtime,也进一步的提升了.程序的启动

开源项目分享:ChatGPT 控制台聊天应用

开源项目分享:ChatGPT 控制台聊天应用 分享一个我最近完成的一个小应用,一个ChatGPT 的控制台聊天应用,大家都在搞AI,我也来玩一玩,顺便分享到社区,有兴趣的小伙伴可以去我的github主页下载体验。 项目简介 ChatGPT 控制台聊天应用 基于.NET8实现,一键拥有你的私人 Cha

Asp-Net-Core开发笔记:使用原生的接口限流功能

前言 之前介绍过使用 AspNetCoreRateLimit 组件来实现接口限流 从 .Net7 开始,AspNetCore 开始内置限流组件,当时我们的项目还在 .Net6 所以只能用第三方的 现在都升级到 .Net8 了,当然是得来试试这个原生组件 体验后:配置使用都比较简单,不过功能也没有 A