c# - 让依赖注入在 Razor .cs 页面之外为 Entity Framework Core 工作
问题描述
这适用于使用 Razor 和 Entity Framework Core 的 ASP.Net Core 2.1。
我认为问题是如何ReadData
在ConfigureServices
方法中定义?
已尝试在MVC 项目之外查看此问题 DbContext Dependency Injection,但仍无法使代码正常工作。
尝试通过 Razor 页面以外的另一个类使用 Entity Framework Core 设置数据库访问。
在方法的Startup
类中,ConfigureServices
我们有这个(我认为这为 Razor 页面 .cs 中的构造函数设置了依赖注入):
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
//Add Dependency Injection references
services.AddScoped<IReadData, ReadData>();
这是一个 Razor .cs 页面,它与构造函数一起使用;但是,我们希望将 db 查找分离到另一个名为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
课程:
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());
}
}
适用于 Razor .cs 页面的依赖注入在此处不起作用。例如,MyPageModel
对于这一行:
private readonly ReadData readData = new ReadData();
它抱怨没有为类的必需参数分配参数ReadData
。
但是,ReadData
如果我们像这样添加链式构造函数:
public ReadData() : this(new MyProject.Data.AppDbContext()) { }
我们得到一个错误:
InvalidOperationException:没有为此 DbContext 配置数据库提供程序。可以通过覆盖 DbContext.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用了 AddDbContext,那么还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象并将其传递给 DbContext 的基本构造函数。
我们如何让依赖注入在ReadData
类中为 Entity Framework Core 工作?
解决方案
你的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 容器为您创建对象。
推荐阅读
- javascript - 如何使用 Javascript 在字符串中找到 HTML 之类的标签?
- excel - 在 Excel VBE ActiveCodePane 中获取光标的行号
- r - data.table: 获取每组的索引 || 两个数据表
- java - 使用弹簧记录 400 和 500 错误
- c# - 那么我如何在 untiy 中禁用脚本并在同一个公共 void 中启用它(idk 它的名称)
- visual-studio - 如何将 unfloding 地图库安装到 VS 代码
- excel - 勾选时获取复选框的单元格地址
- python - 在构建 Kivy 应用程序“未安装 sdkmanager”时
- asp.net-mvc - MVC 验证复选框
- aws-lambda - 部署为 Docker 映像时如何运行多个 lambda 函数?