【发布时间】:2021-08-10 04:23:31
【问题描述】:
我有一个 .NET Core 解决方案,其中包含一个面向 .NET Core 2.1 的 API 项目,我将其升级到 .NET Core 3.1。我已经意识到这样做有许多重大变化,我已经完成并修改为兼容(例如将UseMvc 转换为UseRouting 等等)。但现在我被困在一个:
当我尝试运行 API 项目时,出现以下运行时错误:
某些服务无法构建(验证时出错 服务描述符'ServiceType: Microsoft.Extensions.FileProviders.IFileProvider 生命周期:单例 实施类型: Microsoft.Extensions.FileProviders.PhysicalFileProvider':否 类型的构造函数 'Microsoft.Extensions.FileProviders.PhysicalFileProvider' 可以是 使用服务容器中的服务和默认值进行实例化 值。)
在Startup.cs,ConfigureServices中,有:
services.AddSingleton<IFileProvider, PhysicalFileProvider>();
这当然是问题所在。但我不确定如何将其转换为既兼容又让 API 以原来的方式工作。
我确实找到了an article on file providers 声明:
FileProviderSample 示例应用程序在 Startup.ConfigureServices 方法使用 IHostEnvironment.ContentRootFileProvider:
var physicalProvider = _env.ContentRootFileProvider;
但目前尚不清楚 ConfigureServices 中的确切位置应该去......或者是否替换了 AddSingleton... 或者这将如何影响 API 的行为。所以我不知道该怎么办。
【问题讨论】:
-
您不需要手动添加服务。只需注入
IWebHostEnvironment并在需要时从那里获取文件提供程序。或者,如果您真的需要该服务,您可以改用工厂。services.AddSingleton<IFileProvider>(sp => sp.GetRequiredService<IWebHostEnvironment>().ContentRootFileProvider) -
DI如何在不指定根目录的情况下创建
PhysicalFileProvider的实例? -
您可以自己创建一个实例,指定根目录,然后将该实例注册到服务集合中,如下所示:
services.AddSingleton<IFileProvider, PhysicalFileProvider>(new PhysicalFileProvider("path/to/your/root/"));
标签: c# .net-core .net-core-3.1 fileprovider