控制器传递用户信息,或使用HttpContext.User?

问题描述:

我最近问了一个关于在视图中使用Page.User或HttpContext.Current.User的question。建议我通过控制器传递用户信息?我在其他发布的答案中也看到了这一点。控制器传递用户信息,或使用HttpContext.User?

为什么建议通过控制器传递用户信息,而不是使用Page.User或HttpContext.User?

控制器应该提供所有必要的数据以供查看。这使得视图更具可测性。如果您只使用视图模型内部视图,您可以轻松地编写测试:

  1. 创建视图模型。
  2. 创建视图对象。
  3. 传递模型以查看。
  4. 渲染视图。
  5. 检查结果是否正确。

如果您在视图内部使用了HttpContext.Current,那么您必须在测试中首先对其进行设置,这可能并不容易,并且会增加额外的依赖关系。

它放松您的控制器和应用程序中的其他类之间的耦合。通过使用更多的依赖注入模式,可以提高控制器的可测试性。这是因为在你的测试中,你不需要模拟像HttpContext这样的概念,但可以简单地传入用户对象。

+0

Wait ...在视图中使用HttpContext具有零依赖性,因为视图在浏览器外大部分是无法测试的。仅在控制器内使用HTTPContext ADDS耦合并降低可测试性。 – jfar 2009-11-28 22:27:33

+0

听起来像mawaldne想要访问控制器中的HttpContext,这正是我所说的。控制器应避免直接使用HttpContext/HttpRequest以提高可测试性。 – mckamey 2009-11-28 22:51:19

如果您使用Selenium自动化您的视图测试或使用其他工具来检查您的HTML输出,这只会是实用的。

如果在控制器中使用HTTPContext的情况可能是一个非常糟糕的主意,因为这只会增加控制器操作和HTTPContext之间的耦合。

为了获得最大的可测试性,您可能需要设置一个控制器工厂,当MVC调用它时,可以将用户位注入到控制器中。这样,您的操作方法仍然与HTTPContext分离,并且您可以获得可测试性。

如果你不使用自动化视图测试工具,那么你调用你的HttpContext.User信息并不重要,除非你在视图中做了很多逻辑。例如,如果(HttpContext.User.IsAuthenticated)什么的。如果是这种情况,您可以将它粘贴到控件中并使用RenderPartial或将逻辑位烘焙到您的视图模型中。

对于MVC,推荐的最佳做法是让您的视图尽可能哑。然而,我建议不要让所有关于MVC和模式的教条主义,什么不是。因为MVC没有在SubController功能中烘焙,所以有很多地方打破了MVC模式不仅鼓励,而且不可能不以其他方式打破。 (请参阅MVC 2 RenderAction,RenderPartial,带有控件的MasterPages)