【问题标题】:Specifying type when resolving objects through Ninject通过 Ninject 解析对象时指定类型
【发布时间】:2010-04-12 08:02:19
【问题描述】:

给定 Ninja 类,通过 Ninject 内核中的指定绑定,我可以解析一个对象:

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

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

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

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

【问题讨论】:

  • 反对票是怎么回事?我的问题不清楚 - 还是太愚蠢了?如果是由删除他反对的答案的人;不是我给了你那个downvote..
  • 同上我对stackoverflow.com/questions/2620600/… 的评论。赞成。不确定我是否一定会在没有这种废话的情况下对其进行投票,但这是一个非重复的措辞很好的问题,所以+1

标签: c# .net ioc-container ninject


【解决方案1】:

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

此外,大多数容器应该有一个看起来像这样的重载:

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
  }
}

【讨论】:

    【解决方案2】:

    因为 T 的目的是指定你想要的类型。 Ninject 接收您的类型 T 并代表您调用 typeof(T)。我认为这样你的代码会更短。你不觉得吗?

    【讨论】:

    • 听起来很合理。我有一个需要接收类型的函数 - 那么它应该接收模板样式吗?
    • -1er:不知道我是否会对此表示赞同,但我认为它实际上是正确的并且并非没有帮助。因此,在评论中没有正当理由的情况下,+1 可以执行 -1。像这样散布-1只会给海报+8,否则可能不会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2010-09-22
    相关资源
    最近更新 更多