2015-03-17 7 views
5

Ich versuche Usermanager in einer Klasse zu verwenden, aber ich bin immer diese Fehlermeldung:Wie injiziere ich Identitätsklassen mit Ninject?

Error activating IUserStore{ApplicationUser} 
No matching bindings are available, and the type is not self-bindable. 

ich den Standard-Startup.cs bin mit, die eine einzelne Instanz pro Antrag stellt:

app.CreatePerOwinContext(ApplicationDbContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

ich bin in der Lage, die ApplicationDbContext Instanz zu erhalten, die ich glaube, durch Owin injiziert zu werden (ist das wahr?):

public class GenericRepository<T> : IGenericRepository<T> where T : class 
{ 
    private ApplicationDbContext context; 

    public GenericRepository(ApplicationDbContext context) 
    { 
     this.context = context; 
    } 
} 

Aber ich kann das gleiche mit UserManage nicht tun r (Es führt den Fehler gezeigt vorher):

public class AnunciosService : IAnunciosService 
{ 
    private IGenericRepository<Anuncio> _repo; 
    private ApplicationUserManager _userManager; 

    public AnunciosService(IRepositorioGenerico<Anuncio> repo, ApplicationUserManager userManager) 
    { 
     _repo = repo; 
     _userManager = userManager; 
    } 
} 

Der Controller verwendet die Usermanager wie folgt aus:

public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

Ich verwende ninject zu meinen anderen Klassen zu injizieren, aber wie spritze ich die Usermanager mit seinen Abhängigkeiten und vermeiden Sie es so in meinen Controllern zu verwenden?

Antwort

10

I injiziert es so

kernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>(); 
kernel.Bind<UserManager<ApplicationUser>>().ToSelf(); 

und jetzt ist es funktioniert, wie es sollte.

+0

Nizza Lösung:

kernel.Bind<ApplicationUserManager>().ToMethod(GetOwinInjection<ApplicationUserManager>); kernel.Bind<ApplicationSignInManager>().ToMethod(GetOwinInjection<ApplicationSignInManager>); 

Wenn Sie auch IAuthenticationManger verwenden, können Sie es wie diese injizieren sollte. Es funktioniert auch auf meiner Seite. Vielen Dank. –

+0

Sehr hilfreich, danke. Sie sollten dies als Antwort annehmen, auch wenn Sie Ihre eigene Frage beantwortet haben. –

+0

Haben Sie ein funktionierendes Codebeispiel? Ich habe jetzt seit ein paar Wochen damit zu kämpfen und kann es nicht herausfinden. – Bojan

1

OPs Antwort funktionierte nicht für mich, da ich eine benutzerdefinierte ApplicationUser Klasse verwendet, die long als Schlüssel anstelle von string hat.

Daher habe ich eine generische statische Methode erstellt die würde OwinContext aus dem aktuellen HttpContext bekommen und die gewünschte konkrete Implementierung zurückgeben.

private static T GetOwinInjection<T>(IContext context) where T : class 
{ 
      var contextBase = new HttpContextWrapper(HttpContext.Current); 
      return contextBase.GetOwinContext().Get<T>(); 
} 

habe ich dann GetOwinInjection Methode zur Injektion wie folgt aus:

kernel.Bind<IAuthenticationManager>().ToMethod(context => 
      { 
       var contextBase = new HttpContextWrapper(HttpContext.Current); 
       return contextBase.GetOwinContext().Authentication; 
      });