如何在控制器外部访问RequestContext?

nfp*_*lee 19 asp.net-mvc dependency-injection urlhelper requestcontext

背景

我试图将业务逻辑从控制器转移到他们自己的服务中.

调节器

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

    public AccountController(IAccountService accountService)
    {
        _accountService = accountService;
    }

    ....
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Unity注入依赖项.我想Url.GenerateUrl()在实现中使用helper方法IAccountService但是Url是针对控制器的属性.

我查看了MVC源代码,看看它是如何完成的,但它要求我RequestContext从控制器外部访问,我不知道该怎么做.

如何从控制器外部访问RequestContext?如果这不能解决我的问题,我如何解决我的设置问题?

Luk*_*keH 44

这可能不太对,因为我现在无法测试它,但我认为你可以在.NET 4+中做这样的事情:

using System.Web;
using System.Web.Mvc;

// ...

var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);
Run Code Online (Sandbox Code Playgroud)

可能会更有意义,从控制器的情况下传递到您的IAccountService实现,而不是直接从抓住它HttpContext.Current.

  • 这不起作用,因为没有RequestContext属性. (2认同)
  • @user155899:不用担心。无论如何,达林的答案是更好的答案。 (2认同)

Dar*_*rov 15

但是,我想在我的IAccountService实现中使用Url.GenerateUrl帮助器方法

只需将此信息作为参数传递.例:

public ActionResult Index()
{
    var someUrl = Url.Action("about");
    _accountService.Foo(someUrl);
}
Run Code Online (Sandbox Code Playgroud)

现在,您的服务类中不再需要UrlHelper.需要与MVC基础架构交互的所有内容都不应放在您的服务类中.它们不应该依赖于任何请求,响应,会话......控制器负责处理这些对象并将它们与您的服务类粘合在一起.

  • 这应该会收到更多的赞成票。不应在服务层中使用 HttpContext(如下面的答案所示)。当您想在无权访问 HttpContext 或具有不同端点 URL 的 Restful API 的应用程序中使用您的服务时,会发生什么? (2认同)