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

时间:2010-09-15 22:30:31

标签: asp.net-mvc dependency-injection urlhelper requestcontext

背景

我正在尝试将业务逻辑从控制器转移到他们自己的服务中。

控制器

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

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

    ....
}

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

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

问题

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

2 个答案:

答案 0 :(得分:44)

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

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

// ...

var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);

可能将上下文从控制器传递到IAccountService实现更有意义,而不是直接从HttpContext.Current抓取它。

答案 1 :(得分:15)

  

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

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

public ActionResult Index()
{
    var someUrl = Url.Action("about");
    _accountService.Foo(someUrl);
}

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