2011-09-05 2 views
0

J'ai une dépendance avec un constructeur de paramètres. Quand j'appelle l'action plus que 1x, il montre cette erreur:Ninject: Plusieurs liaisons correspondantes sont disponibles

Error activating IValidationPurchaseService More than one matching bindings are available. Activation path:

1) Request for IValidationPurchaseService

Suggestions:

1) Ensure that you have defined a binding for IValidationPurchaseService only once.

 public ActionResult Detalhes(string regionUrl, string discountUrl, DetalhesModel detalhesModel) 
     { 
       var validationPurchaseDTO = new ValidationPurchaseDTO {...} 

       KernelFactory.Kernel.Bind<IValidationPurchaseService>().To<ValidationPurchaseService>() 
            .WithConstructorArgument("validationPurchaseDTO", validationPurchaseDTO) 
            .WithConstructorArgument("confirmPayment", true); 

       this.ValidationPurchaseService = KernelFactory.Kernel.Get<IValidationPurchaseService>(); 
       ... 
     } 
+1

'KernelFactory.Kernel.Bind'? Dans une action de contrôleur ASP.NET MVC? Oh mon ... Pourquoi utilisez-vous ce modèle de localisateur de service au lieu de l'injection de dépendance? –

Répondre

0

Je ne sais pas ce que vous essayez d'atteindre par le code que vous avez cité. L'erreur est déclenchée car vous liez le même service plus d'une fois, donc lorsque vous essayez de le résoudre, il ne peut pas choisir une liaison (identique) sur une autre. Ce n'est pas ainsi que DI Container est supposé être utilisé. Dans votre exemple, vous ne bénéficiez pas du tout de votre DI. Vous pouvez remplacer votre code:

KernelFactory.Kernel.Bind<IValidationPurchaseService>().To<ValidationPurchaseService>() 
           .WithConstructorArgument("validationPurchaseDTO", validationPurchaseDTO) 
           .WithConstructorArgument("confirmPayment", true); 

    this.ValidationPurchaseService = KernelFactory.Kernel.Get<IValidationPurchaseService>(); 

Avec ceci:

this.ValidationPurchaseService = new ValidationPurchaseService(validationPurchaseDTO:validationPurchaseDTO, confirmPayment:true) 

Si vous pouvez expliquer ce que vous essayez d'atteindre en utilisant ninject dans ce scénario la communauté sera en mesure d'aider.

0

Votre KernelFactory renvoie probablement le même noyau (singleton) à chaque appel successif au contrôleur. C'est pourquoi vous ajoutez une liaison similaire chaque fois que vous cliquez sur l'URL qui active ce contrôleur. Donc, cela fonctionne probablement la première fois et commence à échouer après la deuxième fois.

Questions connexes