我正在尝试将我的应用程序启动从
WebHost
迁移到(较新/推荐)Host
。
当我改变时:
private static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
// start the app.
host.Run();
}
至:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}) // Add Serilog Logger
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
// start the app.
host.Run();
}
我收到以下与依赖项注入相关的错误:
System.AggregateException:“无法构造某些服务(验证服务描述符时出错”ServiceType:Microsoft.Extensions.Localization.IStringLocalizer Lifetime:Singleton ImplementType:UniLocalizer.UniLocalizer”:没有类型“UniLocalizer.UniLocalizer”的构造函数可以使用服务容器中的服务和默认值进行实例化。)'
GPT 给了我线索,一些可能在
WebHost
中初始化的服务不是 Host
的默认服务(按设计应该更轻量),并且这些服务可能由 UniLocalizer 请求。
知道如何诊断/解决这个问题吗?
(对于 WebHost 应用程序工作正常)
最诚挚的问候, IT人
查看存储库中的代码后,问题与配置
UniLocalizer
进行依赖注入有关。该类没有无参数构造函数,并且其依赖项 IStorageProvider
和 string
(以及可选的 CultureInfo
)无法从容器解析,因为它们尚未配置为注入。
但是,似乎
UniLocalizer
类甚至不需要注入 ,因为解决方案中没有类注入它。相反,它是被注入并负责实例化 UniLocalizerFactory
实例的
UniLocalizer
。解决此问题的两种方法:
UniLocalizer
类的第 57 行和第 58 行删除用于依赖注入的
UniLocalizer.ServiceExtensions
配置。考虑到工厂类的使用,这个配置感觉没有必要。
UniLocalizer
可注入,方法是向
UniLocalizer
添加无参数构造函数(例如:
public UniLocalizer() { }
),或者使用工厂方法委托配置其依赖项以进行动态注入。这对我来说毫无用处,因为没有类直接注入
UniLocalizer
,它完全违背了工厂模式的目的!