【问题标题】:Upgrade to .NET Core 3.1 - Can't instantiate singleton PhysicalFileProvider in services升级到 .NET Core 3.1 - 无法在服务中实例化单例 PhysicalFileProvider
【发布时间】: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&lt;IFileProvider&gt;(sp =&gt; sp.GetRequiredService&lt;IWebHostEnvironment&gt;().ContentRootFileProvider)
  • DI如何在不指定根目录的情况下创建PhysicalFileProvider的实例?
  • 您可以自己创建一个实例,指定根目录,然后将该实例注册到服务集合中,如下所示:services.AddSingleton&lt;IFileProvider, PhysicalFileProvider&gt;(new PhysicalFileProvider("path/to/your/root/"));

标签: c# .net-core .net-core-3.1 fileprovider


【解决方案1】:

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

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

这对我有用:

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。然后您可以轻松地从环境中访问文件提供程序。

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 2021-10-13
    • 1970-01-01
    • 2018-01-30
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多