.NET Core 5 - 将类注册为单例,并在其构造函数中使用字符串

问题描述 投票:0回答:1

我有一个 .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 问题中看到的所有内容,但到目前为止没有任何效果。

我做错了什么?

谢谢!

c# .net singleton inversion-of-control .net-5
1个回答
0
投票

抱歉跟进晚了。

我发现问题实际上是由我稍后在启动代码中使用的第三方库引起的,该库用于扫描应用程序依赖项以查找要在容器中注册的类。

此扫描器在幕后注册了一个额外的 SingletonService 实例,这是 IHostBuilder.Build() 抱怨的实例。

一旦我从第三方扫描中排除 SingletonService,代码就会按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.