我有(一个非常人为的例子):
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将抽象类视为接口。
答案 0 :(得分:0)
所以我稍微改变了绑定:
kernel.Bind(x => x.FromThisAssembly().SelectAllClasses().InheritedFrom(typeof(IStrategy)).BindDefaultInterfaces());
所以只是多元化才是问题..
我的想法是Ninject将抽象类视为一个接口,所以从技术上讲,策略可以绑定两个接口。