【问题标题】:Get all types that inherit generic constraint in Ninject在 Ninject 中获取所有继承泛型约束的类型
【发布时间】:2017-01-10 09:04:33
【问题描述】:

我有泛型类型IMyGeneric<T> where T : IBase

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

我试过了:

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

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

我可以获得继承 IBaseforeach 的所有类型并使用 this.kernel.Get(type) 但我将拥有 IEnumerable&lt;object&gt; 而不是 IEnumerable&lt;IMyGeneric&lt;IMyInheritedType&gt;&gt; 并且将无法转换并返回特定的输入例如IEnumerable&lt;IMyGeneric&lt;IBase&gt;&gt; 因为我在施法时出错。

【问题讨论】:

  • IMyGeneric&lt;T&gt; 转换为IMyGeneric&lt;IBase&gt; 仅在接口定义为变体类型时才有效:IMyGeneric&lt;out T&gt;,但即便如此我认为 Ninject 并不真正支持这一点。因此,即使您注册了不同类型的IMyGeneric&lt;T&gt; 列表,Ninject 也可能不会为您获取这些类型。
  • 基于约束获取所有实现的任何其他方式?还是创建 IBaseConstraint(仅用于约束)然后通过 IBase 获取所有内容?虽然我不太喜欢这个主意。
  • 您可能想要更多地展示您的实际实施,以便我们为您提供有关如何进行的反馈。

标签: generics types interface ninject type-constraints


【解决方案1】:

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

  1. 如果请求的类型是可实例化的(例如,当您请求 FooClassFooClass 包含可访问的构造函数时)。
  2. 打开泛型绑定(你有一个封闭的泛型,所以在这里没有帮助)

表示如果您要解析多个IMyGeneric&lt;IBase&gt;,则需要注册多个:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多