我希望能够从 RouteCollection 生成 URL,而无需访问 HttpContext。查看 RouteCollection 的实现方式,所有方法都需要访问 RequestContext 才能获取虚拟路径。
我通过模拟 HttpContext 解决了这个问题,但这增加了对 RhinoMocks 的尴尬依赖,这不是一个合理的解决方案。我是否有其他选项可以在上下文之外生成 URL?
我希望能够从 RouteCollection 生成 URL,而无需访问 HttpContext。查看 RouteCollection 的实现方式,所有方法都需要访问 RequestContext 才能获取虚拟路径。
我通过模拟 HttpContext 解决了这个问题,但这增加了对 RhinoMocks 的尴尬依赖,这不是一个合理的解决方案。我是否有其他选项可以在上下文之外生成 URL?
一个很好的问题,确实。路由本身确实对从正在运行的 ASP.NET 应用程序调用有一些依赖性,例如获取应用程序根 URL 以及 URL 中的任何无 cookie 表单或会话 cookie。虽然创建模拟对象是一种理论上的解决方案,但肯定不建议在运行时使用它。
我的建议是在这种情况下根本不使用路由,并将 URL 硬编码到电子邮件中。电子邮件中的链接必须具有完全限定的 URL(主机名 + 路径),并且路由甚至无法为 URL 生成主机名,因此您已经必须进行硬编码。
抱歉,但习惯于在 MVC 框架中模拟。一旦你开始测试,你就会需要它。那里有很多东西:HttpContext、Session、Server——所有东西都会泄漏到你的控制器中。如果要生成路径,要么需要与 HttpContext 对话(在 MVC 中,这实际上是 HttpContextBase,所以我猜你可以编写自己的具体实现),或者需要模拟它。