这是针对将Razor与Entity Framework Core一起使用的ASP.Net Core 2.1。
我认为问题是如何在do {
if (cond1) {
do_stuff1;
break;
}
if (cond2) {
do_stuff2;
break;
}
if (cond3) {
do_stuff3;
break;
}
} while (0);
方法中定义ReadData
?
曾经尝试查看DbContext Dependency Injection outside of MVC project这个问题,但仍然无法使代码正常工作。
尝试通过除Razor页面以外的其他类使用Entity Framework Core设置数据库访问权限。
在ConfigureServices
方法的Startup
类中,我们有此功能(我认为这为Razor页面.cs中的Constructor设置了依赖项注入):
ConfigureServices
这是一个Razor .cs页面,可与Constructor一起使用;但是,我们希望将数据库查找分为另一个名为services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
//Add Dependency Injection references
services.AddScoped<IReadData, ReadData>();
的类。
ReadData
这是public class MyPageModel : PageModel
{
private readonly MyProject.Data.AppDbContext _context;
private readonly ReadData readData = new ReadData();
public MyPageModel(MyProject.Data.AppDbContext context)
{
_context = context;
}
public IList<Car> Cars { get;set; }
public async Task OnGetAsync()
{
var userName = User.FindFirst(ClaimTypes.Name).Value; // will give the user's userName
Prayer = await readData.FetchCars(userName);
}
}
类:
ReadData
在Razor .cs页面上起作用的依赖项注入在这里不起作用。
例如,在public class ReadData : IReadData
{
private readonly MyProject.Data.AppDbContext _context;
public ReadData(MyProject.Data.AppDbContext context)
{
this._context = context;
}
public async Task<IList<Car>> FetchCars(string carOwner)
{
var cars = _context.Cars.Where(p => p.Owner == carOwner);
return await Task.FromResult(cars.ToList());
}
}
中为此行:
MyPageModel
它抱怨没有为private readonly ReadData readData = new ReadData();
类的必需参数分配参数。
但是在ReadData
中,如果我们添加这样的链接构造函数:
ReadData
我们收到一个错误:
InvalidOperationException:没有为此DbContext配置数据库提供程序。可以通过重写DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。如果使用AddDbContext,则还请确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基本构造函数。
我们如何在public ReadData() : this(new MyProject.Data.AppDbContext()) { }
类中使依赖注入对Entity Framework Core起作用?
答案 0 :(得分:4)
您的ReadData
类应在其构造函数中使用上下文:
public ReadData(MyProject.Data.AppDbContext context)
{
}
现在您只需要将该类注入模型:
public class MyPageModel : PageModel
{
private readonly IReadData _readData ;
public MyPageModel(IReadData readData)
{
_readData = readData;
}
public async Task OnGetAsync()
{
var userName = User.FindFirst(ClaimTypes.Name).Value; // will give the user's userName
var Prayer = await _readData.FetchCars(userName);
}
}
让DI容器为您创建对象。
答案 1 :(得分:1)
只需将IReadData
注入到MyPageModel
的构造函数中
public class MyPageModel : PageModel
{
private readonly MyProject.Data.AppDbContext _context;
private readonly IReadData _readData ;
public MyPageModel(IReadData readData)
{
_readData = readData;
}
public async Task OnGetAsync()
{
var userName = User.FindFirst(ClaimTypes.Name).Value; // will give the user's userName
var Prayer = await _readData.FetchCars(userName);
}
}
不创建ReadData实例
ReadData readData = new ReadData();
让DI容器在您注册services.AddScoped<IReadData, ReadData>();