2014-05-21 9 views
5

Ich habe ein einfaches Stück OWIN Middleware, die mir ein Benutzerobjekt und fügen Sie es HttpContext.Current.Items, so dass es für alle Controller und Ansichten für jede Anfrage verfügbar ist.Verwenden Ninject DI in meiner eigenen OWIN Middleware

Hier ist mein Code:

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); 
    } 
} 

ich Ninject in meiner Web-Anwendung bin mit - wie kann ich diese Middleware-Refactoring, so dass mein UserRepository als Abhängigkeit injiziert wird? Ist das überhaupt möglich?

+2

Haben Sie eine Implementierung ausgewählt? Ich habe auch diese Frage – Saravanan

+0

Ich hoffe, dass ich nicht eine dumme Frage mache, aber haben Sie versucht, es in Ihrem IoC/DI-Container zu binden? 'Bind (). Um ();' –

Antwort

0

Gemäß this page können Sie nur Ihre eigenen Konstruktorargumente angeben.

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

Stellen Sie sicher, dass Sie die Ninject Owin-Pakete wie hier gezeigt verwenden https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up- a-OWIN-WebApi-Anwendung – JRadness

+0

Wenn ich dies mache, bekomme ich eine Ausnahme in der Zeile, wo ich die Middleware registrieren möchte (app.use ()) Zusätzliche Informationen: Die Klasse 'InCube.DigitalAdvisory.WebApi.LoggingMiddleware 'hat keinen Konstruktor, der 1 Argumente nimmt. – Efrain

Verwandte Themen