帖子here中有人评论说在使用MVC时不应该使用HttpContext.Current,而是应该使用ControllerBase.ControllerContext。在某些方面,这是有道理的,但在其他方面却没有。
例如,ControllerContext是一个实例变量,所以我想引用的所有地方,比如我的Session变量,我需要有一个对Controller的引用?为什么我们“不应该”在MVC中使用HttpContext.Current,当你还可以的时候?是否有一个“适当的”MVC“方式”来获取我的Session对象而无需引用Controller?
我知道测试方面,它更好的原因在许多其他地方说明,但我正在研究一个管理Session变量和引用HttpContext.Current的项目,我想知道是否有更好的方法来获取我的手上的Session对象,而不传递对控制器的引用。
答案 0 :(得分:8)
这主要是因为如果使用HttpContext.Current
单元测试会非常困难,因为使用普通的模拟框架无法模拟这个值。
HttpContext.Current
也会造成更脆弱的代码,因为它可能被滥用和滥用。例如,您可以在业务层中使用它,因为它很方便,但如果您选择使用ASP.NET之外的替代表示层,它将会中断。
现在一般来说,静态方法不受欢迎,因为它们不能依赖注入。
答案 1 :(得分:1)
你的一篇帖子是由于模拟测试,根据模拟,可能没有HttpContext,只有控制器上下文。否则,我确实使用HttpContext.Current
,而不是在我的单元测试中。