C#asp.net core没有构造函数注入DbContext

时间:2018-03-14 11:19:42

标签: c# asp.net-core

我尝试创建一个BaseController,它应该包含一个DbContest实例。

UICollectionView

所以当我创建一个新的控制器时,我必须通过构造函数传递DbContext。

我是否有可能从ApplicationDbContext获取一个实例:

public abstract class BaseODataController<T> : ODataController where T : class
{
    protected readonly ApplicationDbContext _db;

    public BaseODataController(ApplicationDbContext db)
    {
        _db = db;
    }
}

所以我不必在每个控制器中传递它?

3 个答案:

答案 0 :(得分:0)

ASP.NET Core依赖注入系统不会解析基类依赖项。您需要通过base语句从派生类的构造函数中明确地将该依赖项提供给基类​​:

public Foo(ApplicationDbContext db) : base(db)
{
    _db = db;
}

答案 1 :(得分:0)

您不需要在派生构造函数中设置字段,但仍必须在派生类上实现构造函数。这与依赖注入无关;它只是继承在C#中的工作方式。构造函数不是继承的,因此如果您希望派生类具有相同的构造函数(它将需要它,以便接受上下文),那么它必须在派生类上声明。但是,您只需将构造逻辑传递给基础构造函数。

public abstract class BaseODataController<T> : ODataController
    where T : class
{
    protected readonly ApplicationDbContext _db;

    public BaseODataController(ApplicationDbContext db)
    {
        _db = db;
    }
}

public class FooController : BaseODataController<Foo>
{
    public FooController(ApplicationDbContext context)
        : base(context)
    {
    }
}

答案 2 :(得分:-3)

可以将依赖项解析器存储在静态类中,并直接在基类构造函数中调用它,例如:

_db = Container.Resolver.Resolve<ApplicationDbContext>();