2013-10-30 16 views
1

我正在使用Ninject(4.0.30319)和NinjectWebCommon.cs的MVC4。我有Ninject設置和使用MVC和WebAPI的一組通用綁定。MVC4/Ninject - 如何在身份驗證後更改綁定

  private static IKernel CreateKernel() 
      { 
       var kernel = new StandardKernel(); 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 

       // Install our Ninject-based IDependencyResolver into the Web API config 
       GlobalConfiguration.Configuration.DependencyResolver = new NinjectWebAPIDependencyResolver(kernel); 

       // Install our Ninject-based IDependencyResolver into the MVC config 
       DependencyResolver.SetResolver(new NinjectMVCDependencyResolver(kernel)); 

       return kernel; 
      } 


      /// <summary> 
      /// Load your modules or register your services here! 
      /// </summary> 
      /// <param name="kernel">The kernel.</param> 
      private static void RegisterServices(IKernel kernel) 
      { 
       kernel.Bind<DBDataContext>().To<DBDataContext>(); 
       kernel.Bind<IChecksRepository>().To<ChecksRepository>(); 
       kernel.Bind<IDepartmentsRepository>().To<DepartmentsRepository>(); 
       kernel.Bind<IEmployeesRepository>().To<EmployeesRepository>(); 
       kernel.Bind<IScheduleRepository>().To<ScheduleRepository>(); 
       kernel.Bind<IVacanciesRepository>().To<VacanciesRepository>(); 
       kernel.Bind<IVacancyTypes>().To<VacancyTypesRepository>(); 
      } 


      public static void RegisterAuthenticatedServices() 
      { 
       bootstrapper.Kernel.Bind<DBDataContext>().To<DBDataContext>().WithPropertyValue("ChangedByPKID", Globals.UserPKID); 
      } 

在Global.asax中我有一些一次性的代碼,以確定當用戶進行身份驗證並呼籲RegisterAuthenticatedServices更改綁定並執行沒有例外。問題是,在綁定被改變並且請求了一個控制器之後,MVC抱怨說「沒有爲這個對象定義的無參數構造函數」,我猜測這意味着DBinContent綁定在Ninject中被拋出。不知道我做錯了什麼。

回答

0

解除綁定的上下文,然後與結合改變回:

 public static void RegisterAuthenticatedServices() 
    { 
     bootstrapper.Kernel.Unbind<DBDataContext>(); 
     bootstrapper.Kernel.Bind<DBDataContext>().To<DBDataContext>().WithPropertyValue("ChangedByPKID", Globals.UserPKID); 
    }