我正在使用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;
- }
- }
- }
- }
- }
- }
希望能帮助到你!