2015-03-17 41 views
5

Próbuję użyć UserManager w klasie, ale ja dostaję ten błąd:Jak wstrzykiwać klasy tożsamości za pomocą programu Ninject?

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

używam domyślnego Startup.cs określający jedno wystąpienie na życzenie:

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

jestem w stanie uzyskać instancję ApplicationDbContext, która moim zdaniem jest coraz wstrzykiwany przez Owin (Czy to prawda?):

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

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

Ale nie mogę zrobić to samo z UserManage r (to wyrzuca błąd pokazany wcześniej):

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

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

Kontroler wykorzystuje UserManager tak:

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

Używam ninject wstrzyknąć moich innych klas, ale jak mogę wstrzyknąć UserManager z jego zależnościami i unikać używania tego w moich kontrolerach?

Odpowiedz

10

Wstrzyknąłem to tak

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

a teraz działa tak jak powinno.

+0

Nicea rozwiązanie. Działa również po mojej stronie. Dzięki. –

+0

Bardzo pomocne, dziękuję. Powinieneś iść dalej i zaakceptować to jako odpowiedź, mimo że odpowiedziałeś na własne pytanie. –

+0

Czy masz przykład działającego kodu? Walczę z tym od kilku tygodni i nie mogę tego zrozumieć. – Bojan

1

Odpowiedź OP nie zadziałała, ponieważ używałem niestandardowej klasy ApplicationUser, która ma long jako klucz zamiast string.

W związku z tym utworzyłem ogólną metodę statyczną, aby uzyskać OwinContext z bieżącego HttpContext i zwrócić żądaną konkretną implementację.

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

I następnie wykorzystywane GetOwinInjection metodę iniekcji takiego:

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

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

Jeśli są również za pomocą IAuthenticationManger, należy wstrzyknąć go tak:

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