2013-08-07 3 views
0

Я делаю логин, используя файл cookie, добавляя IHttpModule. Модуль принимает зависимость от моего DbContext, который установлен в InRequestScope в конфигурации Ninject. Тем не менее, кажется, что модуль HTTP получает другой DbContext, чем остальная часть кода для запроса, хотя я использую (MyContext)DependencyResolver.Current.GetService(typeof(MyContext)); в реализации SendAsync.InRequestScope ObjectContext для IHttpModule

Как я могу получить тот же экземпляр моего DbContext в модулях HTTP, DelegatingHandler и в самом деле?

+0

Вы пробовали с помощью инъекции конструктора вместо его разрешения на распознаватель зависимости? –

+0

Встраивание конструктора не будет работать для 'IHttpModule' и' DelegatingHandler', потому что они создаются один раз за приложение, а не один раз за запрос. –

ответ

1

Вам нужно общее расширение веб-сайта ninject и расширение webapi для ninject. В нашем коде выглядит следующим образом и работает даже с 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()); 
    } 
} 

и, например, наш пользовательский модуль

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) 
    { 
     ... 
    } 

} 
Смежные вопросы