2013-08-07 6 views
0

Je me connecte en utilisant un cookie en ajoutant un IHttpModule. Le module dépend de mon DbContext, qui est défini sur InRequestScope dans la configuration Ninject. Cependant, il semble que le module HTTP obtienne un DbContext différent du reste du code pour la requête, même si j'utilise (MyContext)DependencyResolver.Current.GetService(typeof(MyContext)); dans l'implémentation SendAsync.InRequestScope ObjectContext pour IHttpModule

Comment puis-je obtenir la même instance de mes DbContext dans les modules HTTP, DelegatingHandler s et dans la demande actuelle?

+0

Avez-vous essayé d'utiliser à la place l'injection de constructeur de résoudre le résolveur de dépendance? –

+0

L'injection de constructeur ne fonctionnera pas pour 'IHttpModule' et' DelegatingHandler', car ils sont instanciés une fois par application, pas une fois par requête. –

Répondre

1

Vous avez besoin de l'extension commune web ninject et de l'extension webapi pour ninject. Dans notre code, il ressemble à ce qui suit et fonctionne même avec l'injection Ctor:

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    public static void Start() 
    { 
     ConfigureLogger(); 

     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 


    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     RegisterServices(kernel); 

     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 
     kernel.Bind<IHttpModule>().To<AuthenticationHttpModule>(); 

     return kernel; 
    } 

    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Load(Assembly.GetExecutingAssembly()); 
    } 
} 

et par exemple notre module personnalisé

public class AuthenticationHttpModule : IHttpModule 
{ 
    private readonly IAuthenticationVerifier authenticateVerify; 

    public AuthenticationHttpModule(IAuthenticationVerifier authenticateVerify) 
    { 
     this.authenticateVerify = authenticateVerify; 
    } 

    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication application) 
    { 
     application.AuthenticateRequest += this.OnAuthenticateRequest; 
     application.EndRequest += this.OnEndRequest; 
    } 

    private void OnAuthenticateRequest(object source, EventArgs eventArgs) 
    { 
     var app = (HttpApplication)source; 

     try 
     { 
      var user = this.authenticateVerify.DoAuthentication(app.Request); 

      app.Context.User = user; 
     } 
     catch (InvalidCredentialException) 
     { 
      this.DenyAccess(app); 
     } 
    } 

    private void OnEndRequest(object source, EventArgs eventArgs) 
    { 
     ... 
    } 

}