【问题标题】:What's the difference between .ToConstructor and .ToMethod in Ninject 3?Ninject 3 中的 .ToConstructor 和 .ToMethod 有什么区别?
【发布时间】:2012-02-05 08:12:10
【问题描述】:

在 Ninject3 中有一个新的.ToConstructor feature

如上所述,它有助于强类型构造函数参数,例如:

Bind<IMyService>().ToConstructor(
    ctorArg => new MyService(ctorArg.Inject<IFoo>(), ctorArg.Inject<IBar>()));

以几乎相同的方式使用.ToConstructor.ToMethod之间实际上有什么区别:

Bind<IMyService>().ToMethod(
    x => new MyService(x.Kernel.Get<IFoo>(), x.Kernel.Get<IBar>()));

这只是避免使用 Kernel.Get() 的语法糖还是我还缺少什么?

【问题讨论】:

  • 注意:Get&lt;T&gt; 是一种扩展方法,您必须是 using Ninject; 才能使用它。我花了一分钟,因为直到现在我已经摆脱了using Ninject.Modulesl

标签: c# ninject


【解决方案1】:

第一种情况的行为类似于To&lt;MyService&gt;(),只是您明确选择了构造函数。这意味着上下文通过MyService 传递,您可以使用IFooIBar 或其依赖项之一的条件,在第二种情况下,您将获得IFooIBar 的新上下文,您将不会知道它们被注入到MyService

例如

Bind<IFoo>().To<FooA>().WhenInjectedInto<MyService>();
Bind<IFoo>().To<FooB>().WhenInjectedInto<MyOtherService>();

在第二种情况下不起作用。

【讨论】:

  • 如果有两个具有相同参数名称和不同类型的构造函数,那么选择构造函数很有用,在这种情况下,Ninject 会抛出异常。例如。 Foo(int x)Foo(string x)
  • 可能还值得一提的是,您使用 Inject 方法来保留服务上下文,例如ToConstructor(x =&gt; new FooA(x.Inject&lt;BarA&gt;())) 而不是 x.Context.Kernel.Get&lt;BarA&gt;
猜你喜欢
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2011-06-22
  • 2017-10-22
  • 1970-01-01
相关资源
最近更新 更多