2010-10-14 6 views
2

J'essaye d'auto-lier MembershipProvider dans ASP.NET MVC 2, puis d'utiliser cette liaison dans un constructeur AccountController.Fournisseur d'appartenance auto-liant avec Ninject

C'est un extrait de mes Global.asax.cs

// selfbind MembershipProvider in request scope 
Bind<MembershipProvider>().ToSelf().InRequestScope(); 

Et un extrait de la classe de service:

public AccountMembershipService(MembershipProvider provider, IAccountRepository accountRepository) 
{ 
    _provider = provider ?? Membership.Provider; 
    _accountRepository = accountRepository; 
} 

Mon problème est que l'injection ne fonctionne pas (l'injection pour AccountRepository fonctionne cependant). Ceci est l'erreur de Ninject:

Error activating MembershipProvider using self-binding of MembershipProvider 
No constructor was available to create an instance of the implementation type. 
Activation path: 
    3. Injection of dependency MembershipProvider into parameter provider of constructor of type AccountMembershipService 
    2. Injection of dependency IMembershipService into parameter membershipService of constructor of type AccountController 
    1. Request for IController 

Suggestions: 
1) Ensure that the implementation type has a public constructor. 
2) If you have implemented the Singleton pattern, use a binding with InSingletonScope() instead. 

Réglage InSingletonScope() ne fait aucune différence et je ne peux rien faire au sujet du constructeur puisque ce n'est pas un MembershipProvider personnalisé mais celui par défaut qui est livré avec ASP.NET.

Je suis coincé ici, je ne sais pas comment résoudre ce problème.

Répondre

4

Ok, vous l'avez trouvé. Par erreur, j'ai paramétré MembershipProvider sur moi-même, ce qui n'a pas fonctionné car MembershipProvider est une classe abstraite.

Cela fonctionne

Bind<MembershipProvider>().ToConstant(Membership.Provider); 
2

Vous devez créer un ctor sur le fournisseur d'appartenance vide et un avec le référentiel. Cela suppose que vous ayez correctement enregistré le fournisseur d'appartenances avec le noyau ...

Bind<MembershipProvider>().To<YourMembershipProvider>(); 
    Bind<IMembershipService>().To<AccountMembershipService>(); 
+0

Oui, je pense que votre problème est avec le noyau se liant au fournisseur ... essayez ceci: Bind () Pour () InRequestScope().. ; Vous ne devriez pas avoir besoin de passer ce repo, il devrait être injecté dans le ctor de MembershipProvider ... c'est pourquoi vous avez besoin d'un vide et un avec votre repo là-dessus. – CrazyDart

+0

Je n'ai pas de fournisseur d'abonnement personnalisé pour le moment. Je veux utiliser le fournisseur Membership.Provider par défaut. Mais tout est prêt si nous mettons en place un fournisseur personnalisé à l'avenir. – mare

+0

Hrmmm, je pense que vous devriez me marquer pour la réponse car j'avais raison que la reliure était mauvaise .... et je pourrais utiliser les points. – CrazyDart