获取在Ninject中继承通用约束的所有类型

时间:2016-09-02 09:35:39

标签: generics types interface ninject type-constraints

我有通用类型IMyGeneric<T> where T : IBase

如何让所有类型在ninject中继承IMyGeneric<T>

我试过了:

this.kernel.GetAll<IMyGeneric<IBase>>();

但这不起作用,返回0结果。

我可以获取继承IBase然后foreach所有类型的所有内容并使用this.kernel.Get(type),但之后我会IEnumerable<object>而不是IEnumerable<IMyGeneric<IMyInheritedType>>并且会然后无法投射和返回特定类型,例如IEnumerable<IMyGeneric<IBase>>因为我在演员表上收到错误。

1 个答案:

答案 0 :(得分:1)

Ninject仅支持注入特定注册的类型。除了两个例外:

  1. 如果请求的类型是可实现的(例如,当您请求FooClass并且FooClass包含可访问的构造函数时)。
  2. 打开通用绑定(你有一个封闭的通用,所以它在这里没有帮助)
  3. 表示如果要解决多个IMyGeneric<IBase>,则需要注册几个:

    Bind<Apple>().To<IMyGeneric<IBase>>();
    Bind<Pear>().To<IMyGeneric<IBase>>();
    

    或者,如果这些类型需要通过多种类型解析:

    Bind(typeof(Apple)).To(typeof(IMyGeneric<IBase>), typeof(IMyGeneric<Apple>));
    

    您可以使用Conventions Extension并使用自定义IBindingGenerator来创建绑定,而不是手动定义所有绑定。 或者当然,您也可以编写自己的基于反射的助手。