Model view controller 正在管理层中从MVC路由生成URL。。。

Model view controller 正在管理层中从MVC路由生成URL。。。,model-view-controller,routing,abstraction,Model View Controller,Routing,Abstraction,所以。。。我有一个业务对象/经理,将生成电子邮件 这些电子邮件将包含指向网站上各种内容的链接。。。因此需要了解MVC路由。。或者至少是如何为网站生成URL 但是,我的业务对象将无法访问RequestContext等,并且电子邮件生成不一定是对网站的web请求的结果(我有一个在后台线程上运行的调度器,该线程将生成电子邮件) 你知道我如何在不访问请求的情况下生成URL吗?因此无法使用URLHelper 想法?我更喜欢定义模式,让路由和业务逻辑都知道它。表示同一URL架构的不同实现 原因如下: 您的路

所以。。。我有一个业务对象/经理,将生成电子邮件

这些电子邮件将包含指向网站上各种内容的链接。。。因此需要了解MVC路由。。或者至少是如何为网站生成URL

但是,我的业务对象将无法访问RequestContext等,并且电子邮件生成不一定是对网站的web请求的结果(我有一个在后台线程上运行的调度器,该线程将生成电子邮件)

你知道我如何在不访问请求的情况下生成URL吗?因此无法使用URLHelper


想法?

我更喜欢定义模式,让路由和业务逻辑都知道它。表示同一URL架构的不同实现

原因如下:

  • 您的路由机制可能会改变。例如,在功能中,您可以切换到url_重写模块
  • 负载平衡安装可能存在的问题
  • 您甚至不需要尝试以未记录的方式使用URLHelper

  • 顺便说一句,您可以轻松地从URLHelper替换HttpRequest。我们曾经使用它进行单元测试。有关更多信息,只需搜索HttpContextBase的单元测试或查看的源代码中的示例。这有助于在非托管环境中实例化URL帮助器和所有相关内容。但我仍然不认为这是一个好主意。

    为了在控制器外部获取UrlHelper,您需要将其和路由数据提供给HttpContext。下面是一个例子:

    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;    
    
    HttpContextBase context = new HttpContextWrapper(HttpContext.Current);
    UrlHelper helper =  = new UrlHelper(new RequestContext(context, RouteTable.Routes.GetRouteData(context)));
    
    在ASP.NET MVC5中(可能还有MVC4,我不确定它是什么时候引入的),您可以使用
    HttpRequest.RequestContext
    更直接地执行此操作。例如:

    var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
    

    好。。只要我将我的实现包装在一个接口中,这就不应该是一个问题?例如IRouteHelper?无论如何不确定您所说的“我更喜欢定义模式并使路由和业务逻辑都了解它”是什么意思-您如何使用模式驱动的开发来定义路由?您是否建议我模拟HttpRequest?如果这对您有效,我在IRouteHelper中看不到任何问题。正如您可能注意到的,如果我面临相同的问题(我更喜欢什么),我会选择使用不同的实现。通过模式,我的意思是URL模式(例如,在规范中定义的产品应该位于Invetory/Product/11654)模拟是一种检查它是否执行的双重测试。我当然不建议这样做。我建议实现UrlHelper的依赖项。实际上,您不需要UrlHelper,它只是RouteCollection上的包装器。我想我将定义一个“RouteManager”,它使用路由的xml定义。在web项目中,我将添加一个扩展方法,它知道如何从路由模式的内部表示填充RouteCollection。在我的业务层中,我将添加一个扩展,它知道如何从模式生成URL。想法?我称之为“不同的实现”,是的,我认为这会奏效。