2012-01-08 32 views
28

在Ninject3中有一個新的.ToConstructor featureNinject 3中的.ToConstructor和.ToMethod有什麼區別?

如上所述,它有助於強型構造函數的參數,如:

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>())); 

它只是一個語法糖,以避免使用內核。獲取<>()或有沒有索姆還有什麼我失蹤?

+0

注意:'Get '是一種擴展方法,您必須使用Ninject來使其工作。這花了我一分鐘,因爲我已經逃避了'使用Ninject.Modulesl'直到現在) – 2017-12-05 12:31:23

回答

26

第一種情況的行爲與To<MyService>()的行爲不同,只是您明確地選擇了構造函數。這意味着上下文將通過MyService,您可以使用IFooIBar或其中一個附加條件,在第二種情況下,您將獲得IFooIBar的新上下文,並且您不會知道它們被注入到MyService中。

例如

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

在第二種情況下不起作用。

+0

如果有兩個具有相同參數名稱和不同類型的構造函數,那麼Ninject會拋出一個異常。例如。 'Foo(int x)'和'Foo(string x)' – ashes999 2013-05-29 14:29:30