Castle.Windsor和HttpContextWrapper

cod*_*ike 1 asp.net-mvc castle-windsor httpcontext s#arp-architecture

引入HttpContextWrapper和HttpContextBase,如此处所述,使HttpContext更具可模拟性/可测试性.

我正在尝试将它与S#arp架构一起使用,并遇到一些问题.

我的MVC控制器被设置为在构造函数中接受HttpContextBase参数,并且在Application_Start期间,HttpContextBase在Castle.Windor中注册,如下所示:

container.Register(Component.For<HttpContextBase>().UsingFactoryMethod(
    () => new HttpContextWrapper(HttpContext.Current)));
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但后来我意识到Castle只运行一次Factory方法,所以所有请求都获得了原始的HttpContextWrapper.真的需要为每个请求重新创建它.Castle.Windsor命令将是:

container.Register(Component.For<HttpContextBase().
    LifeStyle.PerWebRequest.UsingFactoryMethod(
    () => new HttpContextWrapper(HttpContext.Current)));
Run Code Online (Sandbox Code Playgroud)

...但事实证明,Castle.Windsor不允许在Application_Start中使用LifeStyle.PerWebRequest(如此处所述)

我该怎么办?有没有一个简单的方法围绕这个或我应该放弃HttpContextWrapper并注入我自己的工厂,以根据需要制作新的工厂?

Dar*_*rov 8

我的MVC控制器设置为接受构造函数中的HttpContextBase参数

你必须在这里做一些极其错误的事情,所以在它为时已晚之前停止并造成损害(物质,道德和人员伤亡:-)).你已经在控制器中有了HttpContext.

不要在DI框架中注册任何HttpContexts.HttpContext处理是ASP.NET的工作.

  • 我这么努力,我的邻居听到鼠标点击. (2认同)