2017-09-19 6 views
1

Je veux injecter AuthenticationService sans utiliser nouvelle:Puis-je injecter IKernel en classe avec Ninject

IAuthenticationService authenticationService = null; 
if (HttpContext.Current != null && HttpContext.Current.Session["LoggedUser"] == null) 
{ 
    HttpContext.Current.Session["LoggedUser"] = new AuthenticationService(); 
} 
authenticationService = (AuthenticationService)HttpContext.Current.Session["LoggedUser"]; 

Je pensais à l'aide kernel.Get(), mais je ne sais pas si c'est une bonne pratique d'injecter IKernel. Je pensais aussi à utiliser une usine, mais je ne sais pas comment l'utiliser avec Ninject.

Que me conseillez-vous?

Répondre

3

Vous ne devez pas injecter IKernel dans une classe et il ne devrait pas être nécessaire de le faire si vous utilisez correctement le conteneur IOC fourni par Ninject. Vous pouvez configurer votre liaison pour le service similaire à ce qui suit:

kernel.Bind<IAuthenticationService>().To<AuthenticationService>();

Notez que selon la façon dont vous avez configuré Ninject, cela pourrait se produire dans quelques endroits différents. Si vous fournissez plus de code, je peux expliquer où cela va. Pour beaucoup, c'est dans la classe NinjectWebCommon.cs.

alors quelle que soit la classe que vous voulez injecter dans IAuthenticationService, il suffit de passer dans le IAuthenticationService comme ce qui suit:

public class WhateverClass 
{ 
    private IAuthenticationService _authenticationService; 

    public WhateverClass(IAuthenticationService authenticationService) 
    { 
    _authenticationService = authenticationService; 
    } 

    //some other properties or methods that make use of authentication service here 
} 
+0

Merci pour la réponse! Je prévois d'injecter WhateverClass InSingletonScope et je voudrais avoir une nouvelle instance de AuthenticationService à chaque fois. – totkov

+0

Cela devrait toujours fonctionner pour vous - Votre liaison pour 'WhateverClass' ressemblera à' kernel.Bind () .à (). InSingletonScope(); 'ou si vous n'avez pas d'interface pour cela:' kernel.Bind (). ToSelf(). InSingletonScope() ' – GregH

+0

@totkov si cela répond à votre question, veuillez accepter la réponse. Si ce n'est pas le cas, je serais heureux d'élaborer sur ce que vous luttez avec. – GregH