我有一个viewmodel,它扩展了一个名为BaseModel的基类,后者又具有DbContext类型的属性。
在调用驱动类时,如何让ninject将DbContext注入基类?
答案 0 :(得分:2)
最可靠的方法是使其成为必需的构造函数参数:
#display {
border: 1px solid black;
}
button {
clear: both;
display: block;
}
#content {
background: rgba(100, 255, 255, 0.5);
padding: 50px 10px;
}
然后在您的视图模型中,只需将DbContext传递给基类:
public abstract class BaseModel
{
private DbContext dbContext;
protected BaseModel(DbContext dbContext) { this.dbContext = dbContext; }
protected DbContext DbContext { get { return this.dbContext; } }
}
听起来你不太了解如何正确使用Ninject,对于我给出的例子,你需要做的只是注册1绑定
public CustomerViewModel : BaseModel
{
public CustomerViewModel(DbContext dbContext)
: base(dbContext) { }
}
然后您可以像这样解析视图模型:
kernel.Bind<DbContext>().To<MyDbContext>(); // Or whatever your DbContext is called.
如果您需要将其解析为另一个类的依赖项,则只需要为var viewModel = kernel.Resolve<CustomerViewModel>();
注册绑定。
答案 1 :(得分:-1)
确保基类&#39;财产是
例如:
abstract class AbstractFoo
{
[Ninject.Inject]
public DbContext DbContext { get; set; }
}
另见Ninject Wiki on Property Injection
(对于未来的读者:这不是真正关于原始问题,但需要回答,因为海报不知道何时需要创建绑定。)
此外,您需要每种类型的绑定,您希望将其注入其他类型(或直接从内核中解析)。
鉴于以下内容:
public class DerivedFoo : AbstractFoo
{
}
和一些应该注入的类Service
:
public class Service
{
public Service(DerivedFoo foo)
{ ... }
}
需要绑定,如:
Bind<DerivedFoo>().ToSelf();
提示:实际上在这种情况下,绑定不是必需的,因为使用ninject的默认配置,如果要解析的类型 - 在这种情况下构造函数参数DerivedFoo foo
是一个具有可访问构造函数的类(abstract class
=&gt;将无法访问!),然后ninject的行为就像您将创建上述绑定一样。您可以禁用此行为,以便ninject 仅解析您实际为其创建绑定的类型。
如果服务看起来略有不同,请说:
public class Service
{
public Service(AbstractFoo foo)
{ ... }
}
你需要像
这样的绑定Bind<AbstractFoo>().To<DerivedFoo>();
同样在以下注入接口而不是类的情况下,您需要绑定:
public class Service
{
public Service(IFoo foo)
{ ... }
}
Bind<IFoo>().To<DerivedFoo>();
在某些情况下,使用Ninject.Extensions.Conventions以减少您需要编写的Bind...
代码的数量是有意义的。
但请注意,约定应具体且易于记忆,并且它们不应重叠(重叠=多个约定适用于同一类型)。
另请参阅this SO question以获取有关约定绑定的更多信息。