【发布时间】:2017-07-23 09:37:27
【问题描述】:
我正在尝试从数据库中加载一些视图,如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 构造函数中,或者在没有IServiceProvider 的情况下在DbFileProvider 中实例化UIDbContext 的任何方法?
【问题讨论】:
-
即使您可能还不知道,但您不想像以前那样使用
DbContext作为文件提供程序源。DbContext不是线程安全的,因此当您为整个提供程序拥有一个 DbContext 实例时,它就无法工作。您必须实例化一个连接(如链接文章中所示)或DbContext每个IFileInfo/IDirectoryContents实例 -
@Tseng 你说得对,我已经遇到过这样的问题。但是实例化一个新的
UIDbContext需要一个DbContextOptions<UIDbContext>的实例,如果没有IServiceProvider,你如何掌握它?将IServiceProvider的引用传递给DbFileProvider以便它使用它来解析DbContextOptions<UIDbContext>是否是个好主意? -
如果我没有完全错,
DbContextOptions<UIDbContext>应该是一个单例,所以你可以在Configure中解决它而没有任何问题并将它传递给你的提供者。或者,您也可以调用构造DbContextOptionsBuilder并构建一个数据库上下文选项,但是您必须重复您在AddDbContext中所做的配置(即.UseSqlServer())。但是它可能很有用,因为它允许您设置不同的设置(即更改包含、错误等的记录方式) -
@Tseng 我觉得你的解决方案很合理,你能把它添加为答案让我接受吗?
-
确实,似乎 DbContextOptions 被注册为单例 blog.oneunicorn.com/2016/10/24/…
标签: razor dependency-injection asp.net-core entity-framework-core