首页 > 解决方案 > 让依赖注入在 Razor .cs 页面之外为 Entity Framework Core 工作

问题描述

这适用于使用 Razor 和 Entity Framework Core 的 ASP.Net Core 2.1。

我认为问题是如何ReadDataConfigureServices方法中定义?

已尝试在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 工作?

标签: c#asp.net-coredependency-injectionasp.net-core-2.1

解决方案


你的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 容器为您创建对象。


推荐阅读