当Concrete实现Abstract时,Ninject绑定AllClasses

时间:2016-01-08 12:20:01

标签: c# ninject

我有(一个非常人为的例子):

interface IStrategy
{
   bool CanHandle(SomeEnum someEnum);

   void Handle(SomeEntity someEntity);

   void ConfigureDb(DbContext context);
}

abstract BaseStrategy : IStrategy
{
   abstract bool CanHandle(SomeEnum someEnum);

   abstract void Handle(SomeEntity someEntity);

   virtual void Configure(DbContext context)
   {
       context.LazyLoading = true;
   }
}

class SomeEntityStrategy : BaseStrategy
{
    /* Assume this has been implemented */
}


class SomeOtherEntityStrategy : BaseStrategy
{
    /* Assume this has been implemented */
}

所以我认为:

kernel.Bind(x => x.FromThisAssembly().SelectAllClasses().InheritedFrom(typeof(IStrategy)).BindDefaultInterface());

将所有具体实现绑定到接口IStrategy

在我的构造函数中,我做了:

ctor(IEnumerable<IStrategy> strategies)

这是一个空列表。

所以这可能已经在其他地方得到了回答,但我并不完全确定我应该搜索什么。

修改

所以出于某种原因,我不介意澄清为什么BindAllInterfaces有效?

所以我的想法是Ninject将抽象类视为接口。

1 个答案:

答案 0 :(得分:0)

所以我稍微改变了绑定:

kernel.Bind(x => x.FromThisAssembly().SelectAllClasses().InheritedFrom(typeof(IStrategy)).BindDefaultInterfaces());

所以只是多元化才是问题..

我的想法是Ninject将抽象类视为一个接口,所以从技术上讲,策略可以绑定两个接口。