使用Ninject注入基类属性

时间:2015-08-17 20:10:25

标签: .net asp.net-mvc ninject

我有一个viewmodel,它扩展了一个名为BaseModel的基类,后者又具有DbContext类型的属性。

在调用驱动类时,如何让ninject将DbContext注入基类?

2 个答案:

答案 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;财产是

  • 公开并有一个公共制定者:
  • 使用[Ninject.Inject]属性
  • 进行注释

例如:

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

减少&#34;绑定工作量&#34;你必须做

在某些情况下,使用Ninject.Extensions.Conventions以减少您需要编写的Bind...代码的数量是有意义的。 但请注意,约定具体且易于记忆,并且它们不应重叠(重叠=多个约定适用于同一类型)。 另请参阅this SO question以获取有关约定绑定的更多信息。