0

我有一个 .NET Core 解决方案,其中包含一个针对 .NET Core 2.1 的 API 项目,我将其升级到 .NET Core 3.1。我已经意识到这样做有许多重大变化,我已经经历了这些变化并对其进行了修改以使其兼容(例如转换UseMvcUseRouting等)。但现在我被困在一个:

当我尝试运行 API 项目时,出现以下运行时错误:

无法构造某些服务(验证服务描述符“ServiceType:Microsoft.Extensions.FileProviders.IFileProvider Lifetime:Singleton ImplementationType:Microsoft.Extensions.FileProviders.PhysicalFileProvider”时出错:没有“Microsoft.Extensions.FileProviders”类型的构造函数。 PhysicalFileProvider' 可以使用服务容器中的服务和默认值来实例化。)

在 Startup.cs 的 ConfigureServices 中,有:

services.AddSingleton<IFileProvider, PhysicalFileProvider>();

这当然是问题所在。但我不确定如何将其转换为既兼容又让 API 以原来的方式工作。

我确实找到了一篇关于文件提供程序的文章,其中指出:

FileProviderSample 示例应用使用 IHostEnvironment.ContentRootFileProvider 在 Startup.ConfigureServices 方法中创建提供程序:

var physicalProvider = _env.ContentRootFileProvider;

但目前尚不清楚 ConfigureServices 中应该去的确切位置......或者它是否取代了AddSingleton......或者这将如何影响 API 的行为。所以我不知道该怎么办。

4

1 回答 1

0

PhysicalFileProviderDI 如何在不指定根目录的情况下创建实例?

您可以通过自己指定根来创建一个实例,然后将该实例注册到服务集合中。

这对我有用:

public void ConfigureServices(IServiceCollection services) {
  // (...)
  IFileProvider fp = new PhysicalFileProvider("C:\\path\\to\\by\\root");
  // or, you could get the file provider from the environment:
  // IFileProvider fp = _env.ContentRootFileProvider;
  services.AddSingleton<IFileProvider, PhysicalFileProvider>(_ => fp);
  // (...)
}

然后,我只是将它注入到我的 DI 托管类中:

IFileProvider _fileProvider;

public FilesController(IFileProvider fp) {
  this._fileProvider = fp;
}

作为替代方案,如果您不介意更改类的构造函数参数,则可以注入IWebHostEnvironment。然后,您可以从环境轻松访问文件提供程序。

于 2021-05-21T01:08:40.770 回答