我尝试创建一个BaseController,它应该包含一个DbContest实例。
UICollectionView
所以当我创建一个新的控制器时,我必须通过构造函数传递DbContext。
我是否有可能从ApplicationDbContext获取一个实例:
public abstract class BaseODataController<T> : ODataController where T : class
{
protected readonly ApplicationDbContext _db;
public BaseODataController(ApplicationDbContext db)
{
_db = db;
}
}
所以我不必在每个控制器中传递它?
答案 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>();