在ASP.NET Core中将DbContext注入到FileProvider中

时间:2017-07-23 09:37:28

标签: razor dependency-injection asp.net-core entity-framework-core

我正在尝试按照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的情况下在DbFileProviderIServiceProvider实例化{{1}} ?

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

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