Razor 将DbContext注入ASP.NET核心中的FileProvider

Razor 将DbContext注入ASP.NET核心中的FileProvider,razor,dependency-injection,asp.net-core,entity-framework-core,Razor,Dependency Injection,Asp.net Core,Entity Framework Core,我正在尝试从数据库加载一些视图,如中所述。所以我想在文件提供程序中使用EF Core RazorViewEngineOptions有一个FileProviders属性,您可以将文件提供程序添加到该属性中。问题是你必须给它一个文件提供者的安装。因此,您需要在Startup的ConfigureServices方法中实例化所有文件提供程序的依赖项 目前,我将IServiceProvider的一个实例注入启动的Configure方法中。然后我将实例存储在一个字段中(称为\u serviceProvide

我正在尝试从数据库加载一些视图,如中所述。所以我想在文件提供程序中使用EF Core

RazorViewEngineOptions
有一个
FileProviders
属性,您可以将文件提供程序添加到该属性中。问题是你必须给它一个文件提供者的安装。因此,您需要在Startup的
ConfigureServices
方法中实例化所有文件提供程序的依赖项

目前,我将
IServiceProvider
的一个实例注入启动的
Configure
方法中。然后我将实例存储在一个字段中(称为
\u serviceProvider
):

然后在
ConfigureServices
中,我使用该字段实例化
UIDbContext

services.Configure<RazorViewEngineOptions>(options =>
{
    var fileProvider = new DbFileProvider(_serviceProvider.GetService<UIDbContext>());
    options.FileProviders.Add(fileProvider);
});
services.Configure(选项=>
{
var fileProvider=newdbfileprovider(_serviceProvider.GetService());
options.FileProviders.Add(fileProvider);
});

有没有更好的方法可以将
UIDbContext
注入
DbFileProvider
构造函数,或者没有
IServiceProvider
的情况下在
DbFileProvider
内部实例化
UIDbContext
的方法?

您不想以您的方式使用
DbContext
作为文件提供程序源代码是的

DbContext
不是线程安全的,因此当整个提供程序只有一个
DbContext
实例时,它将不起作用,因为多个请求可能会同时调用
DbContext
及其操作多次,导致在尝试并行执行两个查询时出现异常

您必须根据
IFileInfo
/
IDirectoryContents
实例实例化一个连接(如链接文章中的连接)或
DbContext

DbContextOptions应该注册为singleton,这样您就可以在Configure`w/o中解决它一次,而不存在任何问题,并将其传递给提供商

或者,您也可以调用
DbContextOptionsBuilder
并构建一个
DbContextOptions
,但随后您必须重复在
AddDbContext
中所做的配置(即
.UseSqlServer()


但是,它可能很有用,因为它允许您设置不同的设置(即更改包含、错误等的记录方式)。

您不希望像以前那样使用
DbContext
作为文件提供程序源

DbContext
不是线程安全的,因此当整个提供程序只有一个
DbContext
实例时,它将不起作用,因为多个请求可能会同时调用
DbContext
及其操作多次,导致在尝试并行执行两个查询时出现异常

您必须根据
IFileInfo
/
IDirectoryContents
实例实例化一个连接(如链接文章中的连接)或
DbContext

DbContextOptions应该注册为singleton,这样您就可以在Configure`w/o中解决它一次,而不存在任何问题,并将其传递给提供商

或者,您也可以调用
DbContextOptionsBuilder
并构建一个
DbContextOptions
,但随后您必须重复在
AddDbContext
中所做的配置(即
.UseSqlServer()


但是,它可能很有用,因为它允许您设置不同的设置(即更改包含、错误等的记录方式)。

即使您可能还不知道它,但您不想像以前那样使用
DbContext
作为文件提供程序源
DbContext
不是线程安全的,因此当整个提供程序只有一个DbContext实例时,它将不起作用。您必须根据
IFileInfo
/
IDirectoryContent
instance@Tseng你说得对,我已经面临过这方面的问题。但是实例化一个新的
UIDbContext
需要一个
DbContextOptions
的实例,如果没有
IServiceProvider
,您如何获得它?将
IServiceProvider
的引用传递给
DbFileProvider
以便它使用它来解析
DbContextOptions
?如果我没有完全错,那么
DbContextOptions
应该是单例,因此,您可以解决它,而不必考虑
配置
中的任何问题,并将其传递给提供商。或者,您也可以调用construct
DbContextOptionsBuilder
并构建数据库上下文选项,但随后必须重复在
AddDbContext
中所做的配置(即
.UseSqlServer()
)。不过,它可能很有用,因为它允许您设置不同的设置(即更改包含、错误等的记录方式)@Tseng我认为您的解决方案非常合理,您可以将其添加为答案,以便我可以接受吗?事实上,DbContextOptions似乎已注册为singleton,即使您可能还不知道它,但您不希望像以前那样使用
DbContext
作为文件提供程序源
DbContext
不是线程安全的,因此当整个提供程序只有一个DbContext实例时,它将不起作用。您必须根据
IFileInfo
/
IDirectoryContent
instance@Tseng你说得对,我已经面临过这方面的问题。但是实例化一个新的
UIDbContext
需要一个
DbContextOptions
的实例,如果没有
IServiceProvider
,您如何获得它?将
IServiceProvider
的引用传递给
DbFileProvider
,以便它使用它来解析
DbContextOptions
,这是一个好主意吗?如果我没有完全错的话,
DbContextOptio
services.Configure<RazorViewEngineOptions>(options =>
{
    var fileProvider = new DbFileProvider(_serviceProvider.GetService<UIDbContext>());
    options.FileProviders.Add(fileProvider);
});