Castle.Windsor 和 HttpContextWrapper

2023-12-07

HttpContextWrapper 和 HttpContextBase,如在这里解释,被引入是为了使 HttpContext 更加可模拟/可测试。

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

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

container.Register(Component.For<HttpContextBase>().UsingFactoryMethod(
    () => new HttpContextWrapper(HttpContext.Current)));

这似乎工作了一段时间,但后来我意识到 Castle 只运行该工厂方法一次,因此所有请求都会获取原始的 HttpContextWrapper。实际上,它需要为每个请求重新创建。 Castle.Windsor 命令是:

container.Register(Component.For<HttpContextBase().
    LifeStyle.PerWebRequest.UsingFactoryMethod(
    () => new HttpContextWrapper(HttpContext.Current)));

...但事实证明 Castle.Windsor 不允许在 Application_Start 中使用 LifeStyle.PerWebRequest (正如这里所解释的)

我应该做什么?有没有一种简单的方法可以解决这个问题,或者我应该放弃 HttpContextWrapper 并注入我自己的工厂来根据需要创建新的工厂?


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

你必须做点什么极其错误在这里,所以在为时已晚并造成损害之前停止(物质、精神和人员伤亡:-))。您已经在控制器内拥有 HttpContext。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Castle.Windsor 和 HttpContextWrapper 的相关文章

随机推荐