我正在尝试构建自定义视图位置系统。
public class myViewLocationExpander : IViewLocationExpander
{
private myDBContext _context;
public myViewLocationExpander (myDBContext context)
{
_context = context;
}
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{
_context.Property.//..... //Error happened here
Some other codes
}
在我的启动文件中
public void ConfigureServices(IServiceCollection services)
{
//other codes
services.AddMvc();
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new myViewLocationExpander (new myDBContext()));
});
我的错误1:
处理请求时发生未处理的异常。 InvalidOperationException:未配置任何数据库提供程序。在设置服务时,通过在DbContext类或AddDbContext方法中覆盖OnConfiguring来配置数据库提供程序。 Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)
错误2:
EntityFramework.Core.dll中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理 附加信息:尝试在配置上下文时使用上下文。 DbContext实例不能在OnConfiguring中使用,因为此时仍在配置它。
如何在类中使用dbcontext(我需要从DB获取一些信息),该类应放在启动文件的Configure()
方法上。
或者我可以将IViewLocation
..放到另一个地方吗?
答案 0 :(得分:0)
在IViewLocationExpander的代码中,您可以使用以下代码context.ActionContext.HttpContext.ApplicationServices.GetService( typeof( myDbContext ) )
从上下文中获取IServiceProvider,这将返回您的DbContext。
public class MyViewLocationExpander : IViewLocationExpander
{
public void PopulateValues( ViewLocationExpanderContext context )
{
var dbContext = context.ActionContext.HttpContext.ApplicationServices.GetService<ApplicationDbContext>();
}
public IEnumerable<string> ExpandViewLocations( ViewLocationExpanderContext context, IEnumerable<string> viewLocations )
{
var dbContext = context.ActionContext.HttpContext.ApplicationServices.GetService<ApplicationDbContext>();
return viewLocations;
}
}
我注意到它第二次调用PopulateValues时不是第一次我没有时间进一步研究这个