2010-04-12 8 views
1

Compte tenu de la classe Ninja, ayant une valeur spécifiée de liaison dans le noyau Ninject je peux résoudre un objet faisant:type Spécification lors de la résolution des objets par Ninject

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

Mais pourquoi je ne peux pas le faire:

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

Quelle est la bonne façon de spécifier le type en dehors de l'appel de Get?

+0

Qu'est-ce qui est avec le downvote? Ma question n'est pas claire - ou trop stupide? Si c'était par la personne qui a supprimé sa réponse downvoted; ce n'est pas moi qui vous ai donné cette downvote .. – stiank81

+1

Idem mon commentaire sur http://stackoverflow.com/questions/2620600/specifying-type-when-resolving-objects-through-ninject/2620636#2620636. Upvoting. Je ne sais pas si je l'aurais forcément mis à jour sans cette absurdité mais c'est une question non-dup bien formulée donc +1 –

Répondre

4

La spécification d'arguments de type n'est pas une chose d'exécution, elle est compilée statiquement. Le type doit être connu au moment de la compilation. Dans votre scénario, il est potentiellement inconnu ou calculé lors de l'exécution. Grâce à la réflexion, il est possible de construire un appel de méthode où vous spécifiez les arguments de type, mais il est peu probable que vous vouliez le faire.

En outre, la plupart des conteneurs doivent avoir une surcharge qui ressemblerait à quelque chose comme ceci:

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

Enfin, la plupart des conteneurs doivent fournir des moyens de spécifier dans la configuration du conteneur, quel type doit être fourni sur certaines conditions. Je sais que Ninject a un joli DSL pour spécifier conditionnellement quel type devrait être retourné dans quelles circonstances. Cela signifierait cependant, de coder par rapport à une abstraction et de laisser le conteneur décider ce qui est retourné:

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

Merci! Bonne explication. – stiank81

0

Puisque le but du T est de spécifier le type que vous voulez. Ninject reçoit votre type T et appelle typof (T) en votre nom. Je pense que de cette façon votre code est plus court. Tu ne penses pas?

+0

Cela semble raisonnable. J'ai une fonction qui doit recevoir le type - devrait-il le recevoir alors? – stiank81

+0

-1er: Je ne sais pas si je l'aurais upvoted, mais je pense que c'est factuellement correct et pas inutile. D'où un +1 pour faire un -1 sans justification dans un commentaire. Scattering -1s comme ceci autour donne juste l'affiche +8 qui pourrait ne pas être arrivé autrement. –