我試圖從here中所述的數據庫加載一些視圖。所以我想在文件提供程序中使用EF Core。將DbContext注入到ASP.NET Core的FileProvider中
RazorViewEngineOptions
有一個FileProviders
屬性,您可以將您的文件提供程序添加到。問題是你必須給它一個文件提供程序的例子。因此,您需要在Startup的ConfigureServices
方法中實例化所有文件提供程序的依賴項。
目前,我向啓動的Configure
方法注入IServiceProvider
的實例。然後,我實例存儲在一個字段(稱爲_serviceProvider
):
IServiceProvider _serviceProvider;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider provider)
{
_serviceProvider = provider;
...
}
然後在ConfigureServices
我使用該字段來實例化的UIDbContext
。
services.Configure<RazorViewEngineOptions>(options =>
{
var fileProvider = new DbFileProvider(_serviceProvider.GetService<UIDbContext>());
options.FileProviders.Add(fileProvider);
});
有沒有更好的辦法能注入UIDbContext
到DbFileProvider
構造函數或任何方式來實例化一個UIDbContext
內DbFileProvider
沒有IServiceProvider
?
即使您可能還不知道,但是您不希望**按照您的方式使用'DbContext'作爲文件提供程序源。 'DbContext' **不是線程安全的**,所以當你爲整個提供者使用一個DbContext實例時,它將不起作用。你必須通過IFileInfo實例化一個連接(就像在鏈接文章中一樣)或者DbContext''IseireInfo'''IdentifierContents'實例 – Tseng
@Tseng你是對的,我已經遇到了問題。但是實例化一個新的'UIDbContext'需要'DbContextOptions的一個實例''如何在沒有'IServiceProvider'的情況下得到這個結果?將'IServiceProvider'的引用傳遞給'DbFileProvider'是否是一個好主意,以便它使用它來解析'DbContextOptions'? –
Encrypt0r
如果我沒有完全錯誤,'DbContextOptions'應該是一個單身人士,所以你可以解決它沒有任何問題'配置'裏面,並傳遞給你的提供者。或者,您也可以調用構造'DbContextOptionsBuilder'並構建一個數據庫上下文選項,但是您必須在'AddDbContext'(即'.UseSqlServer()')內重複配置。但它可以是有用的,因爲它允許你設置不同的設置(即改變方式如何包括,錯誤等登錄) –
Tseng