Ninject 当 Concrete 实现 Abstract 时绑定 AllClasses

Ninject Bind AllClasses when Concrete implements Abstract

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

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 将抽象 类 视为接口。

所以我稍微更改了绑定:

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

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

我的想法是 Ninject 正在处理抽象 class 接口,因此从技术上讲,有 2 个接口可以绑定到策略。