2012-02-03 51 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工作進程。

相關問題