我正在尝试按照here中的描述从数据库加载一些视图。所以我想在文件提供程序中使用EF Core。
RazorViewEngineOptions
具有FileProviders
属性,您可以将文件提供程序添加到该属性中。问题是你必须给它一个文件提供者的实例。因此,您需要实例化所有文件提供程序'依赖于Startup的ConfigureServices
方法。
目前,我将IServiceProvider
的实例注入到Configure
启动方法中。然后我将实例存储在一个字段(称为_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
实例化{{1}} ?
答案 0 :(得分:0)
您不希望像以前那样使用DbContext
作为文件提供者来源。
DbContext
不是线程安全的,因此当您为整个提供程序提供一个DbContext
实例时,它将无法工作,因为多个请求可以调用DbContext
并且它在同一时间运行多次,导致在尝试并行执行2个查询时出现异常。
您必须实例化连接(例如在链接文章中)或DbContext
每个IFileInfo
/ IDirectoryContents
实例。
DbContextOptions<UIDbContext> should be registered as singleton, so you can resolve it once
在配置中没有任何问题,并将其传递给您的提供商。
或者您也可以调用DbContextOptionsBuilder
并构建/构建DbContextOptions<T>
,但是您必须在AddDbContext
内重复配置(即.UseSqlServer()
)。
但它可能很有用,因为它允许您设置不同的设置(即更改包含方式,错误等的记录方式)。