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

4
我正在使用Ninject在MVC3应用程序中。
我的一个可解决的依赖项使用HttpContext.Current.Server.MapPath("~/App_Data")。
当我在Global.asax(Application_Start)中初始化IoC容器时,我可以在我的模块配置中定义:
.WithConstructorArgument("basePath", HttpContext.Current.Server.MapPath("~/App_Data"));

由于我的模块正在与应用程序相同的线程中初始化,因此HttContext.Current不为null。
然后,我不得不将我的依赖项注入初始化移到一个PreAppStart方法中,使用WebActivator。由于在这种情况下HttContext尚不可用,因此我必须删除我的dep的参数初始化。
我通过在运行时在我的类实例中解析HttpContext来解决了问题。但是,事实证明,只要该实例从Request线程调用,就可以做到这一点。一旦我将已解决的实例调用移动到单独的线程中(不会中断控制器的ActionResult生成),我遇到了同样的问题 - 无法再获得HttpContext 。如何在我的情况下解决它?
附言:刚才发现我仍然可以从Global.asax应用程序启动中调用我的依赖项上的方法,并从那里提供HttpContext。无论如何,请告诉我最好的方法。

4
使用HostingEnvironment.MapPath可以吗? - Mark Seemann
1个回答

1

在Ninject中应该有一种方法可以使用委托以懒惰的方式注册依赖项。这样只有在访问依赖项时才会解决它。

以下是我使用StructureMap的方法:

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

关于从不同线程访问HttpContext,您可以使用AsyncManager.Sync(d)方法,该方法接受委托并在ASP .NET工作进程中运行它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接