当Concrete实现Abstract时,Ninject绑定所有类

本文关键字:绑定 Ninject Concrete 实现 Abstract | 更新日期: 2023-09-27 18:29:33

我有(一个非常做作的例子):

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

当Concrete实现Abstract时,Ninject绑定所有类

所以我稍微更改了绑定:

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

因此,多元化才是问题所在。。

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