ASP.NET MVC问题将DbContext解析为Derived类

时间:2018-03-08 14:01:15

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

我有一个带有Microsoft.Extensions.DependencyInjection的ASP.NET Core 2.0应用程序。

我将我的上下文ApplicationDbContext添加到Startup.cs文件中:

services.AddDbContext<ApplicationDbContext>(options => 
    options.UseSqlServer(DefaultConnection));

我的ApplicationDbContext继承了DbContext类:

在通用控制器中,我需要DbContext类:

public GenericController(DbContext context){

但是Microsoft.Extensions.DependencyInjection无法解析DbContextApplicationDbContext注册的服务。

如何将所需的DbContext类注入我的服务类?

我可以更改GenericController,但GenericController所在的项目没有引用ApplicationDbContext

我正在开发一个中间件,它应该需要专门用于其他项目的DbContext。所以控制器在中间件中,它没有对专用类的引用。

3 个答案:

答案 0 :(得分:2)

  

GenericController所在的项目没有引用ApplicationDbContext

这是你问题的100%。

您需要确保ApplicationDbContext在项目中,使用它的服务可以引用:

public GenericController(ApplicationDbContext context){

或者你需要创建一个由IApplicationDbContext实现的ApplicationDbContext,可以从使用它的服务中引用它:

public GenericController(IApplicationDbContext context){

单独注入DbContext不会削减它,因为它不会暴露您的应用程序需要使用的任何表。

答案 1 :(得分:1)

另一种解决方案可以是将DbContext注册到自定义工厂,该工厂将从容器中返回已经注册的ApplicationDbContext实例:

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(DefaultConnection));
services.AddScoped<DbContext, ApplicationDbContext>(s => s.GetService<ApplicationDbContext>());

答案 2 :(得分:0)

我通过在AddContext命令下面将派生类的Transient添加到父类来解决它

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(DefaultConnection));
services.AddTransient<DIADbContext,ApplicationDbContext>();