В чем разница между .ToConstructor и .ToMethod в Ninject 3? - PullRequest
31 голосов
/ 08 января 2012

В Ninject3 есть новая функция .ToConstructor .

Как описано, это помогает строго набирать аргументы конструктора, такие как:

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<> () или я скучаю по чему-то большему?

1 Ответ

29 голосов
/ 08 января 2012

Первый случай ведет себя как To<MyService>() за исключением того, что вы явно выбираете конструктор.Это означает, что контекст передается через MyService, и вы можете использовать условия для IFoo и IBar или одну из их зависимостей, когда во втором случае вы получите новый контекст для IFoo и IBar, и вы не будетезнать, что они вводятся в MyService.

например,

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

не будет работать во втором случае.

...