在Razor .cs页面之外使依赖项注入对Entity Framework Core起作用

时间:2018-12-24 20:08:37

标签: c# asp.net-core dependency-injection asp.net-core-2.1

这是针对将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起作用?

2 个答案:

答案 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>();

时解决您的依赖性