2010-08-22 9 views
1

Je voudrais faire quelque chose comme ceci:"liaisons multiples" erreur lors de l'appel ninject2.Get <ConcreteClass>()

ConcreteClass foo = ninject2.Get<ConcreteClass>(
    new ConstructorArgument("bar", "qux")); 

ninject2.Bind<ConcreteClass>().ToConstant(foo); 

... 

ConcreteClass foo = ninject2.Get<ConcreteClass>(); // fail! 

Lorsque je tente, je reçois l'erreur Error activating ConcreteClass. More than one matching bindings are available.

Qu'est-ce qui se passe ici?

+0

Je ne vois vraiment pas pourquoi cela méritait un -1 de quelqu'un. Même si je ne pensais pas que ça valait un +1 (je l'ai fait, je l'aurais neutralisé le downvote car il n'a pas donné de raison) –

Répondre

0

OOTB, Ninject (en particulier, v2 - in v1, paramètre facultatif activé par défaut) génère en interne des liaisons implicites pour les classes concrètes, avec la portée par défaut (Transient in v2). Ces enregistrements sont ajoutés dans la liste Liaisons comme si vous les aviez ajoutés vous-même via.

Bind<ConcreteClass>().ToSelf(); // .InTransientScope(); -- But that would be implicit 

Si vous avez besoin quelque chose de différent dans votre reliure, vous enregistrez un Bind ment avant qu'il ne soit lié automatiquement, avec Votre bit de personnalisation à la:

Bind<ConcreteClass>().ToSelf().<<Your Customisation Bit>>; 

Dans ce cas, votre recours est d'utiliser quelque chose comme:

Bind<ConcreteClass>().ToSelf().InSingletonScope().WithConstructorArgument("foo", "bar"); 

InSingletonScope() ne respecterait le code actuel en ce qu'elle ressemble yo Vous voulez seulement en instancier un. En général, comme cela est couvert dans d'autres réponses, il ne faut pas nécessairement chercher InSingletonScope comme un outil de premier recours.

+0

Merci beaucoup. J'avais une vague idée de ce qui se passait, mais votre réponse a été claire - et maintenant mon code fonctionne comme prévu. J'adore Ninject, mais j'aimerais qu'il soit mieux documenté. – Metaphile

+0

@Metaphile: Je vois une édition sur http://github.com/ninject/ninject/wikis/why-use-ninject dans les derniers jours - alors abonnez-vous au flux et gardez la foi! (Sérieusement, la source et les tests sont si simples, l'option USL est la voie à suivre) –