0

我試圖從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); 
}); 

有沒有更好的辦法能注入UIDbContextDbFileProvider構造函數或任何方式來實例化一個UIDbContextDbFileProvider沒有IServiceProvider

+1

即使您可能還不知道,但是您不希望**按照您的方式使用'DbContext'作爲文件提供程序源。 'DbContext' **不是線程安全的**,所以當你爲整個提供者使用一個DbContext實例時,它將不起作用。你必須通過IFileInfo實例化一個連接(就像在鏈接文章中一樣)或者DbContext''IseireInfo'''IdentifierContents'實例 – Tseng

+0

@Tseng你是對的,我已經遇到了問題。但是實例化一個新的'UIDbContext'需要'DbContextOptions的一個實例''如何在沒有'IServiceProvider'的情況下得到這個結果?將'IServiceProvider'的引用傳遞給'DbFileProvider'是否是一個好主意,以便它使用它來解析'DbContextOptions '? – Encrypt0r

+0

如果我沒有完全錯誤,'DbContextOptions '應該是一個單身人士,所以你可以解決它沒有任何問題'配置'裏面,並傳遞給你的提供者。或者,您也可以調用構造'DbContextOptionsBuilder'並構建一個數據庫上下文選項,但是您必須在'AddDbContext'(即'.UseSqlServer()')內重複配置。但它可以是有用的,因爲它允許你設置不同的設置(即改變方式如何包括,錯誤等登錄) – Tseng

回答

0

您不想像您那樣使用DbContext作爲文件提供程序源。

DbContext是不是線程安全的,所以當你有一個單一的DbContext實例爲整個商將無法正常工作,因爲多個請求可以調用DbContext,並在同一時間操作不止一次,導致在嘗試並行執行2個查詢時出現異常。

您必須通過IFileInfo/IDirectoryContents實例來實例化連接(如鏈接文章中所示)或DbContext

DbContextOptions<UIDbContext> should be registered as singleton, so you can resolve it once裏面配置沒有任何問題,並將其傳遞給您的提供商。

另外,您也可以撥打DbContextOptionsBuilder並建立/構造DbContextOptions<T>,但你不得不重複爲你所做的內部AddDbContext配置(即.UseSqlServer())。

然而,它可以是有用的,因爲它允許您設置不同的設置(即改變如何記錄包括錯誤等的方式)。

相關問題