2015-03-17 19 views
5

sto cercando di utilizzare UserManager in una classe, ma sto ottenendo questo errore:Come si inseriscono le classi di identità con Ninject?

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

sto usando il default Startup.cs, che imposta una singola istanza per richiesta:

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

sono in grado di ottenere l'istanza ApplicationDbContext, che credo sia sempre iniettato da Owin (è vero?):

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

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

ma non posso fare lo stesso con UserManage r (Esso genera l'errore indicato in precedenza):

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

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

Il controller utilizza l'UserManager in questo modo:

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

sto usando Ninject per iniettare le mie altre classi, ma come faccio a iniettare l'UserManager con le sue dipendenze ed evita di usarlo così nei miei controller?

risposta

10

ho iniettato in questo modo

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

E ora sta funzionando come dovrebbe.

+0

bella soluzione. Funziona anche dalla mia parte. Grazie. –

+0

Molto utile, grazie. Dovresti andare avanti e accettare questa come risposta anche se hai risposto alla tua stessa domanda. –

+0

Ti capita di avere un esempio di codice funzionante? Ho lottato con questo per un paio di settimane e non riesco a capirlo. – Bojan

1

La risposta di OP non ha funzionato per me, poiché stavo usando una classe personalizzata ApplicationUser che ha long come chiave invece di string.

Quindi, ho creato un metodo statico generico che otterrebbe il OwinContext dall'attuale HttpContext e restituisce l'implementazione concreta desiderata.

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

Ho quindi utilizzato GetOwinInjection metodo per iniezione in questo modo:

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

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

Se si utilizza anche IAuthenticationManger, la somministri non in questo modo:

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