簡體   English   中英

升級到 .NET Core 3.1 - 無法在服務中實例化 singleton PhysicalFileProvider

[英]Upgrade to .NET Core 3.1 - Can't instantiate singleton PhysicalFileProvider in services

我有一個 .NET 核心解決方案,其中包含一個針對 .NET 核心 2.1 的 API 項目,我將其升級到 Z303CB0EF9EDB9082AZ 核心。 我已經意識到這樣做有許多重大變化,我已經完成並修改為兼容(例如將UseMvc轉換為UseRouting等)。 但現在我被困在一個:

當我嘗試運行 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 中的確切位置應該是 go ... 或者是否替換了AddSingleton ... 或者這將如何影響 API 的行為。 所以我不知道該怎么辦。

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 管理的 class 中:

IFileProvider _fileProvider;

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

作為替代方案,如果您不介意更改 class 的構造函數參數,則可以注入IWebHostEnvironment 然后,您可以從環境輕松訪問文件提供程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM