2014-05-21 12 views
5

Zrobiłem prosty element oprogramowania pośredniego OWIN, który dostarczy mi obiekt User i doda go do HttpContext.Current.Items, więc jest dostępny dla wszystkich kontrolerów i widoków dla każdego żądania.Użyj Ninject DI w moim własnym oprogramowaniu OWIN

Oto mój kod:

public class SetCurrentUserMiddleware : OwinMiddleware 
{ 
    public SetCurrentUserMiddleware(OwinMiddleware next) : base(next) 
    { 
    } 

    public override Task Invoke(IOwinContext context) 
    { 
     if (context.Request.User.Identity.IsAuthenticated) 
     { 
      // Do some work to get a userId... (omitted) 
      var repo = new UserRepository(); 
      User user = repo.Get(userId); 
      HttpContext.Current.Items["CurrentUserContext"] = user; 
     } 

     return Next.Invoke(context); 
    } 
} 

Używam Ninject w mojej aplikacji internetowej - Jak mogę byłaby to middleware tak, że mój UserRepository wstrzykuje się jako zależność? Czy to w ogóle możliwe?

+2

Czy wybrałeś jakąkolwiek implementację. Też mam to pytanie – Saravanan

+0

Mam nadzieję, że nie robię głupiego pytania, ale czy próbowałeś związać je wewnątrz swojego kontenera IoC/DI? 'Bind (). Do ();' –

Odpowiedz

0

Zgodnie z this page, można po prostu podać własne argumenty konstruktora.

public class SetCurrentUserMiddleware : OwinMiddleware 
{ 
    private readonly IUserRepository userRepository; 

    public SetCurrentUserMiddleware(OwinMiddleware next, IUserRepository userRepository) : base(next) 
    { 
     if (userRepository == null) 
      throw new ArgumentNullException("userRepository"); 
     this.userRepository = userRepository; 
    } 

    public override Task Invoke(IOwinContext context) 
    { 
     if (context.Request.User.Identity.IsAuthenticated) 
     { 
      // Do some work to get a userId... (omitted) 
      User user = this.userRepository.Get(userId); 
      HttpContext.Current.Items["CurrentUserContext"] = user; 
     } 

     return Next.Invoke(context); 
    } 
} 
+0

Upewnij się, że używasz pakietów Ninject Owin, jak pokazano tutaj https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up- a-OWIN-WebApi-application – JRadness

+0

Kiedy to zrobię, otrzymuję wyjątek na linii, na której chcę zarejestrować oprogramowanie pośrednie (app.use ()) Dodatkowe informacje: Klasa "InCube.DigitalAdvisory.WebApi.LoggingMiddleware "nie ma konstruktora pobierającego 1 argumenty. – Efrain

Powiązane problemy