我试图从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