2012-02-03 52 views
4

我在MVC3应用程序中使用Ninject。如何将HttpContext传递给MVC3应用程序中的依赖项初始化

我的一个解析的依赖使得使用HttpContext.Current.Server.MapPath("~/App_Data")

回来时,我被初始化在Global.asax中(的Application_Start)IoC容器,我能够只是在我的模块配置定义:

.WithConstructorArgument("basePath", HttpContext.Current.Server.MapPath("~/App_Data")); 

由于我的模块是从与应用程序相同的线程初始化的,因此HttContext.Current不为空。

然后,我不得不将我的依赖注入初始化移动到PreAppStart方法,使用WebActivator。由于HttContext在这种情况下还不可用,所以我必须删除我的dep的参数初始化。

我在运行时解决了我的类实例中的HttpContext问题,解决了这个问题。但事实证明,只要从请求线程调用实例,就可以实现这一点。只要我将已解决的实例调用移动到单独的线程(不要停止控制器的生成),我就会遇到同样的问题 - 不再能够获得HttpContext。我如何在我的情况下解决它?

P.S.刚刚发现我仍然可以从Global.asax应用程序开始调用我的依赖方法,并从那里提供HttpContext。不过,让我知道哪个是最好的方法。

+4

HostingEnvironment.MapPath会为你工作吗? – 2012-02-03 06:51:27

回答

1

Ninject应该有一种方式使用委托以惰性方式注册依赖关系。这种方式只会在您访问依赖关系时解决。

下面是一个使用StructureMap它,我该怎么办:

For<HttpContextBase>().Use(c => new HttpContextWrapper(HttpContext.Current)); 

至于访问的HttpContext从不同的线程,你可以使用AsyncManager.Sync(d)方法,它委托并运行它ASP .NET工作进程。

相关问题