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())。

然而,它可以是有用的,因为它允许您设置不同的设置(即改变如何记录包括错误等的方式)。

相关问题