我有一个 .NET 5 Web 应用程序,在其中我尝试将特定类注册为单例实例。
我知道.NET 5现在已经不再支持,并且计划在不久的将来升级这个应用程序,但由于一些不幸的设计限制,我必须暂时将该应用程序保留在.NET 5中。
我正在使用样板 .NET Core DI/IoC 服务注册。
这个特定的类接受两个字符串作为参数,对应于一些应用程序/环境配置变量。
由于这些参数,我知道我不能这样做:
services.AddSingleton<ISingletonService, SingletonService>();
运行时不知道在 Service 构造函数中使用什么字符串。有道理。
所以,在我的 Startup.cs 中,我尝试了一些不同的事情。
我尝试初始化 SingletonService 的新实例,使用从规范类设置的字符串,并将该实例注册为接口的单例(这是应用程序的工作方式):
var singletonService = new SingletonService(spec.EnvVariable, spec.AppVariable);
services.AddSingleton<ISingletonService>(singletonService);
我还尝试将此实例注册为具体类型(即使应用程序仅引用接口):
var singletonService = new SingletonService(spec.EnvVariable, spec.AppVariable);
services.AddSingleton(singletonService);
我还尝试将实例注册为接口和具体类型。
考虑到规范可能存在问题,我尝试将实例构造函数调用中的规范引用替换为各自的常量:
var singletonService = new SingletonService("envVariable", "appVariable");
services.AddSingleton<ISingletonService>(singletonService);
我还尝试使用实现工厂注册单例:
services.AddSingleton<ISingletonService>(provider =>
{
var spec = provider.GetService<RegistrySpec>();
return new SingletonService(spec.EnvVariable, spec.AppVariable);
});
知道应用程序构建器有时对配置服务()和配置()方法中的内容很挑剔,我还尝试将单例注册调用移动到配置服务()方法中的不同位置。
当我在应用程序主机实际构建之前检查 IServiceCollection 时,我可以看到 ISingletonService 和 SingletonService 都在集合中注册,我初始化的实例列为其 ImplementInstance 属性。
但是,在上述所有情况下,应用程序在调用 IHostBuilder.Build() 时都会出错,并出现异常
Unable to resolve service for type 'System.String' while attempting to activate SingletonService.
似乎我已经尝试了在 Microsoft 文档或其他相关 SO 问题中看到的所有内容,但到目前为止没有任何效果。
我做错了什么?
谢谢!
抱歉跟进晚了。
我发现问题实际上是由我稍后在启动代码中使用的第三方库引起的,该库用于扫描应用程序依赖项以查找要在容器中注册的类。
此扫描器在幕后注册了一个额外的 SingletonService 实例,这是 IHostBuilder.Build() 抱怨的实例。
一旦我从第三方扫描中排除 SingletonService,代码就会按预期工作。