给定Ninja类,在Ninject内核中具有指定的绑定,我可以解析一个这样做的对象:

var ninja = ninject.Get<Ninja>();


但是我为什么不能这样做:

Type ninjaType = typeof(Ninja);
var ninja = ninject.Get<ninjaType>();


在Get调用之外指定类型的正确方法是什么?

最佳答案

指定类型参数不是运行时的事情,它是静态编译的。该类型必须在编译时知道。在您的方案中,它可能是未知的,或在运行时计算的。通过反思,可以在指定类型参数的地方构造一个方法调用,但是您不太可能想要这样做。

此外,大多数容器都应该具有如下所示的重载:

Type ninjaType = typeof(Ninja);
var ninja = (Ninja)ninject.Get(ninjaType);


最后,大多数容器应提供在容器配置中指定的方式,在某些条件下应提供哪种类型。我知道Ninject有一个漂亮的DSL,可以有条件地指定在什么情况下应该返回哪种类型。但是,这意味着要针对抽象进行编码,然后让容器决定返回的内容:

class DependencyConsumer {
  ctor(IWarrior warrior) {
    //Warrior could be a ninja, because e.g. you told NInject
    //that the dependency should be filled that way for this class
  }
}

关于c# - 通过Ninject解析对象时指定类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2620600/

10-11 22:10