我正在使用MVC3和Ninject启动Web应用程序.在Global.asax文件中我还需要一个依赖项,它需要是一个单例.
我认为应该是这样的:
public class MvcApplication : NinjectHttpApplication { IUserAuthentication _auth; public MvcApplication() { base.AuthenticateRequest += new EventHandler(MvcApplication_AuthenticateRequest); } protected override IKernel CreateKernel() { var _kernel = new StandardKernel(new SecurityModule()); _auth = _kernel.Get<IUserAuthentication>(); return _kernel; } void MvcApplication_AuthenticateRequest(object sender,EventArgs e) { _auth.ToString(); }
但是当我调用MvcApplication_AuthenticateRequest时,我看到_auth为null.
然后我尝试这样:
public class MvcApplication : NinjectHttpApplication { ItUserAuthentication _auth; IKernel _kernel; public MvcApplication() { _kernel = new StandardKernel(new SecurityModule()); _auth = _kernel.Get<IUserAuthentication>(); base.AuthenticateRequest += new EventHandler(MvcApplication_AuthenticateRequest); } protected override IKernel CreateKernel() { return _kernel; } void MvcApplication_AuthenticateRequest(object sender,EventArgs e) { _auth.ToString(); }
但现在我可以看到构造函数被多次调用,因此我将有几个IKernel,我想单例实例在我的应用程序范围内不会是单例.
我该怎么办?使用静态变量?
解决方法
我们就是这样做的,我做了一些测试,我的AuthService似乎只进入他的控制器一次:
public class MvcApplication : NinjectHttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default",// Route name "{controller}/{action}/{id}",// URL with parameters new { controller = "Home",action = "Index",id = UrlParameter.Optional } // Parameter defaults ); } protected override IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Load(Assembly.GetExecutingAssembly()); kernel.Bind<ISession>().To<MongoSession>().InRequestScope(); kernel.Bind<IAuthenticationService>().To<AuthenticationService>().InSingletonScope(); kernel.Bind<IMailer>().To<Mailer>().InRequestScope(); kernel.Bind<IFileProvider>().To<MongoFileProvider>().InRequestScope(); return kernel; } protected override void OnApplicationStarted() { base.OnApplicationStarted(); AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); } protected void Application_AuthenticateRequest(Object sender,EventArgs e) { if (HttpContext.Current.User != null) { if (HttpContext.Current.User.Identity.IsAuthenticated) { if (HttpContext.Current.User.Identity is FormsIdentity) { var id = (FormsIdentity) HttpContext.Current.User.Identity; var ticket = id.Ticket; var authToken = ticket.UserData; var authService = (IAuthenticationService)DependencyResolver.Current.GetService(typeof(IAuthenticationService)); var user = authService.GetUserForAuthToken(authToken); if (user != null) { user.SetIdentity(HttpContext.Current.User.Identity); HttpContext.Current.User = (IPrincipal) user; } } } } } }
希望能帮助到你!