20

背景

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

控制器

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

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

    ....
}

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

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

问题

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

4

2 回答 2

45

这可能不太正确,因为我目前无法对其进行测试,但我认为您可以在 .NET 4+ 中执行以下操作:

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

// ...

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

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

于 2010-09-15T22:38:40.227 回答
18

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

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

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

现在您的服务类中不再需要 UrlHelper。任何需要与 MVC 基础设施交互的东西都不应该放在你的服务类中。它们不应该依赖于任何请求、响应、会话……控制器有责任使用这些对象并将它们与您的服务类粘合在一起。

于 2010-09-16T06:36:01.250 回答