C# 在Razor.cs页面之外为实体框架核心进行依赖注入
这是针对ASP.NETCore2.1的,它使用Razor和实体框架核心 我认为问题在于如何在C# 在Razor.cs页面之外为实体框架核心进行依赖注入,c#,asp.net-core,dependency-injection,asp.net-core-2.1,C#,Asp.net Core,Dependency Injection,Asp.net Core 2.1,这是针对ASP.NETCore2.1的,它使用Razor和实体框架核心 我认为问题在于如何在ConfigureServices方法中定义ReadData 我们已经试着研究这个问题,但仍然无法让代码正常工作 试图通过除Razor页面之外的另一个类使用Entity Framework Core设置数据库访问 在ConfigureServices方法中的Startup类中,我们有以下内容(我认为这将在Razor pages.cs中为构造函数设置依赖注入): 下面是ReadData类: public c
ConfigureServices
方法中定义ReadData
我们已经试着研究这个问题,但仍然无法让代码正常工作
试图通过除Razor页面之外的另一个类使用Entity Framework Core设置数据库访问
在ConfigureServices
方法中的Startup
类中,我们有以下内容(我认为这将在Razor pages.cs中为构造函数设置依赖注入):
下面是ReadData
类:
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());
}
}
它抱怨没有为ReadData
类的所需参数分配参数
但是,在ReadData
中,如果我们像这样添加链接构造函数:
public ReadData() : this(new MyProject.Data.AppDbContext()) { }
我们得到一个错误:
InvalidOperationException:尚未为此DbContext配置任何数据库提供程序。可以通过重写DbContext.OnConfigurang方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。如果使用AddDbContext,那么还要确保DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基本构造函数
我们如何让依赖项注入在
ReadData
类中为实体框架核心工作?只需在MyPageModel
的构造函数上注入IReadData
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=新的ReadData()
让DI容器在注册
services.AddScoped()时解析依赖项
只需在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=新的ReadData()
让DI容器在注册
services.AddScoped()时解析依赖项代码>您的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容器为您创建对象。您的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容器为您创建对象