Razor 将DbContext注入ASP.NET核心中的FileProvider
我正在尝试从数据库加载一些视图,如中所述。所以我想在文件提供程序中使用EF CoreRazor 将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
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
应该是单例,因此,您可以解决它,而不必考虑配置中的任何问题,并将其传递给提供商。或者,您也可以调用constructDbContextOptionsBuilder
并构建数据库上下文选项,但随后必须重复在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);
});