Указание типа при разрешении объектов через Ninject - PullRequest
1 голос
/ 12 апреля 2010

Учитывая класс Ninja, с указанной привязкой в ​​ядре Ninject я могу разрешить объект, выполнив это:

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

Но почему я не могу сделать это:

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

Как правильно указать тип вне вызова Get?

Ответы [ 2 ]

4 голосов
/ 12 апреля 2010

Указание аргументов типа - это не время выполнения, оно статически компилируется. Тип должен быть известен во время компиляции. В вашем сценарии он потенциально неизвестен или вычисляется во время выполнения. С помощью отражения можно создать вызов метода, в котором вы указываете аргументы типа, но вряд ли вы захотите это сделать.

Кроме того, большинство контейнеров должно иметь перегрузку, которая будет выглядеть примерно так:

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
  }
}
0 голосов
/ 12 апреля 2010

Так как целью T является указание типа, который вы хотите. Ninject получает ваш тип T и вызывает typeof (T) от вашего имени. Я думаю, что таким образом ваш код короче. Тебе не кажется?

...