问题描述
我开始用MVC3和Ninject的Web应用程序。有一种依赖,我还需要在这需要一个单身Global.asax文件。
I'm starting a web application with MVC3 and Ninject. There is one dependency that I also need in the Global.asax file that needs to be a singleton.
我想应该是这样的:
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();
}
但后来我看到 _auth
为空时, MvcApplication_AuthenticateRequest
被调用。
然后我尝试这样的:
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,我想这个单实例不会在我的应用范围,使单身。
But now I can see that the constructor is being called several times, therefore I will have several IKernel, and I guess that singleton instances won't be so singleton in my app scope.
我应该怎么办呢?使用静态变量?
How should I do it? Using a static variable?
推荐答案
这是我们如何做到这一点,我做了一些测试,我的AuthService似乎在他的控制器去一次:
This is how we do it, I did some testing and my AuthService seems to go in his controller only once :
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;
}
}
}
}
}
}
希望它帮助!
这篇关于Ninject-ING在Global.asax中的依赖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!