[英]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.