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


    异常描述:This service descriptor is keyed. Your service provider may not support keyed services.

    场景:.Net8  WebAPI应用程序中使用AutoFac替代了默认的DI容器

    当使用键值注册服务后:

    builder.Services.AddKeyedSingleton("big");

    builder.Services.AddKeyedSingleton("small");

    程序启动运行到:

    var app = builder.Build();   出现上述异常。

     

    异常排查过程:

    1.根据提示,由于键值服务注册前,使用了Autofac的程序集注册方式RegisterAssemblyTypes,一开始以为是服务已被注册导致的。在程序集外部重写了样例服务,添加注册后问题重现。

    2.进一步怀疑是默认的容器键值注册方式版本问题,于是切换使用了AutoFac容器的键值注册方式:

    ContainerBuilder.RegisterType().Keyed(key);

    程序启动后,不报错了。以为问题解决了,结果在使用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有问题了。

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

     
  • 相关阅读:
    Linux 网络编程项目 —— FTP 网盘
    Java核心知识点整理大全7-笔记
    VUE3+Cesium+Three项目源码
    Codeforces Round 952 (Div. 4)(实时更新)
    【Java面试】RDB 和 AOF 的实现原理、优缺点
    Spring和Netty整合详解
    (附源码)php丽江旅游服务网站系统 毕业设计 010149
    【mysql】CommunicationsException: Communications link failure
    【开题报告】基于uniapp的在线考试小程序的设计与实现
    Netty12-TCP粘包拆包
  • 原文地址:https://www.cnblogs.com/chenxf1117/p/18255775